blob: 89ff49aeac60e7fa5d02a81bb2f7e497d824e71f [file] [log] [blame]
// Copyright 2017 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cpp_token.h"
namespace {
int Mul(int v1, int v2) { return v1 * v2; }
int Div(int v1, int v2) { return v2 == 0 ? 0 : v1 / v2; }
int Mod(int v1, int v2) { return v2 == 0 ? 0 : v1 % v2; }
int Add(int v1, int v2) { return v1 + v2; }
int Sub(int v1, int v2) { return v1 - v2; }
int RShift(int v1, int v2) { return v1 >> v2; }
int LShift(int v1, int v2) { return v1 << v2; }
int Gt(int v1, int v2) { return v1 > v2; }
int Lt(int v1, int v2) { return v1 < v2; }
int Ge(int v1, int v2) { return v1 >= v2; }
int Le(int v1, int v2) { return v1 <= v2; }
int Eq(int v1, int v2) { return v1 == v2; }
int Ne(int v1, int v2) { return v1 != v2; }
int And(int v1, int v2) { return v1 & v2; }
int Xor(int v1, int v2) { return v1 ^ v2; }
int Or(int v1, int v2) { return v1 | v2; }
int LAnd(int v1, int v2) { return v1 && v2; }
int LOr(int v1, int v2) { return v1 || v2; }
} // anonymous namespace
namespace devtools_goma {
const int CppToken::kPrecedenceTable[] = {
9, 9, 9, // MUL, DIV, MOD,
8, 8, // ADD, SUB,
7, 7, // RSHIFT, LSHIFT,
6, 6, 6, 6, // GT, LT, GE, LE,
5, 5, // EQ, NE,
4, // AND,
3, // XOR,
2, // OR,
1, // LAND,
0, // LOR,
};
const CppToken::OperatorFunction CppToken::kFunctionTable[] = {
Mul, Div, Mod, Add, Sub, RShift, LShift, Gt, Lt, Ge, Le, Eq, Ne,
And, Xor, Or, LAnd, LOr
};
string CppToken::DebugString() const {
string str;
str.reserve(16);
switch (type) {
case IDENTIFIER:
str.append("[IDENT(");
str.append(string_value);
str.append(")]");
break;
case STRING:
str.append("[STRING(\"");
str.append(string_value);
str.append("\")]");
break;
case NUMBER:
str.append("[NUMBER(");
str.append(string_value);
str.append(", ");
str.append(std::to_string(v.int_value));
str.append(")]");
break;
case DOUBLESHARP:
return "[##]";
case TRIPLEDOT:
return "[...]";
case NEWLINE:
return "[NL]\n";
case ESCAPED:
str.append("[\\");
str.push_back(v.char_value.c);
str.append("]");
break;
case MACRO_PARAM:
str.append("[MACRO_PARAM(arg");
str.append(std::to_string(v.param_index));
str.append(")]");
break;
case MACRO_PARAM_VA_ARGS:
str.append("[MACRO_PARAM_VA_ARGS]");
break;
case CHAR_LITERAL:
str.append("[CHAR_LITERAL(");
str.append(std::to_string(v.int_value));
str.append(")]");
break;
case END:
return "[END]";
default:
str.append("[");
if (!string_value.empty()) {
str.append(string_value);
} else if (v.char_value.c) {
str.push_back(v.char_value.c);
} else {
str.append(v.char_value.c2);
}
str.append("]");
}
return str;
}
string CppToken::GetCanonicalString() const {
if (!string_value.empty())
return string_value;
if (v.char_value.c)
return string() + v.char_value.c;
return v.char_value.c2;
}
} // namespace devtools_goma