1328 lines
19 KiB
C++
1328 lines
19 KiB
C++
/**
|
|
* PANDA 3D SOFTWARE
|
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
*
|
|
* All use of this software is subject to the terms of the revised BSD
|
|
* license. You should have received a copy of this license along
|
|
* with this source code in a file named "LICENSE."
|
|
*
|
|
* @file cppToken.cxx
|
|
* @author drose
|
|
* @date 1999-10-22
|
|
*/
|
|
|
|
#include "cppToken.h"
|
|
#include "cppExpression.h"
|
|
#include "cppIdentifier.h"
|
|
#include "cppBison.h"
|
|
#include "pdtoa.h"
|
|
|
|
#include <ctype.h>
|
|
|
|
/**
|
|
*
|
|
*/
|
|
CPPToken::
|
|
CPPToken(int token, int line_number, int col_number,
|
|
const CPPFile &file, const std::string &str,
|
|
const YYSTYPE &lval) :
|
|
_token(token), _lval(lval)
|
|
{
|
|
_lval.str = str;
|
|
_lloc.first_line = line_number;
|
|
_lloc.first_column = col_number;
|
|
_lloc.last_line = line_number;
|
|
_lloc.last_column = col_number;
|
|
_lloc.file = file;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
CPPToken::
|
|
CPPToken(int token, const YYLTYPE &loc, const std::string &str, const YYSTYPE &val) :
|
|
_token(token), _lval(val), _lloc(loc)
|
|
{
|
|
_lval.str = str;
|
|
}
|
|
|
|
/**
|
|
* A named constructor for the token returned when the end of file has been
|
|
* reached.
|
|
*/
|
|
CPPToken CPPToken::
|
|
eof() {
|
|
return CPPToken(0);
|
|
}
|
|
|
|
/**
|
|
* Returns true if this is the EOF token.
|
|
*/
|
|
bool CPPToken::
|
|
is_eof() const {
|
|
return _token == 0;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
void CPPToken::
|
|
output(std::ostream &out) const {
|
|
switch (_token) {
|
|
case REAL:
|
|
out << "REAL " << _lval.u.real;
|
|
break;
|
|
|
|
case INTEGER:
|
|
out << "INTEGER " << _lval.u.integer;
|
|
break;
|
|
|
|
case CHAR_TOK:
|
|
out << "CHAR_TOK " << _lval.u.integer << " = " << _lval.str;
|
|
break;
|
|
|
|
case SIMPLE_STRING:
|
|
out << "SIMPLE_STRING " << _lval.str;
|
|
break;
|
|
|
|
case STRING_LITERAL:
|
|
out << "STRING_LITERAL " << *_lval.u.expr;
|
|
break;
|
|
|
|
case SIMPLE_IDENTIFIER:
|
|
out << "SIMPLE_IDENTIFIER " << _lval.str;
|
|
break;
|
|
|
|
case IDENTIFIER:
|
|
out << "IDENTIFIER " << *_lval.u.identifier;
|
|
break;
|
|
|
|
case TYPENAME_IDENTIFIER:
|
|
out << "TYPENAME_IDENTIFIER " << *_lval.u.identifier;
|
|
break;
|
|
|
|
case SCOPING:
|
|
out << "SCOPING " << *_lval.u.identifier << "::";
|
|
break;
|
|
|
|
case TYPEDEFNAME:
|
|
out << "TYPEDEFNAME " << _lval.str;
|
|
break;
|
|
|
|
case ELLIPSIS:
|
|
out << "ELLIPSIS";
|
|
break;
|
|
|
|
case OROR:
|
|
out << "OROR";
|
|
break;
|
|
|
|
case ANDAND:
|
|
out << "ANDAND";
|
|
break;
|
|
|
|
case EQCOMPARE:
|
|
out << "EQCOMPARE";
|
|
break;
|
|
|
|
case NECOMPARE:
|
|
out << "NECOMPARE";
|
|
break;
|
|
|
|
case LECOMPARE:
|
|
out << "LECOMPARE";
|
|
break;
|
|
|
|
case GECOMPARE:
|
|
out << "GECOMPARE";
|
|
break;
|
|
|
|
case LSHIFT:
|
|
out << "LSHIFT";
|
|
break;
|
|
|
|
case RSHIFT:
|
|
out << "RSHIFT";
|
|
break;
|
|
|
|
case POINTSAT_STAR:
|
|
out << "POINTSAT_STAR";
|
|
break;
|
|
|
|
case DOT_STAR:
|
|
out << "DOT_STAR";
|
|
break;
|
|
|
|
case UNARY_NOT:
|
|
out << "UNARY_NOT";
|
|
break;
|
|
|
|
case UNARY_MINUS:
|
|
out << "UNARY_MINUS";
|
|
break;
|
|
|
|
case UNARY_PLUS:
|
|
out << "UNARY_PLUS";
|
|
break;
|
|
|
|
case UNARY_NEGATE:
|
|
out << "UNARY_NEGATE";
|
|
break;
|
|
|
|
case UNARY_STAR:
|
|
out << "UNARY_STAR";
|
|
break;
|
|
|
|
case UNARY_REF:
|
|
out << "UNARY_REF";
|
|
break;
|
|
|
|
case POINTSAT:
|
|
out << "POINTSAT";
|
|
break;
|
|
|
|
case SCOPE:
|
|
out << "SCOPE";
|
|
break;
|
|
|
|
case PLUSPLUS:
|
|
out << "PLUSPLUS";
|
|
break;
|
|
|
|
case MINUSMINUS:
|
|
out << "MINUSMINUS";
|
|
break;
|
|
|
|
case TIMESEQUAL:
|
|
out << "TIMESEQUAL";
|
|
break;
|
|
|
|
case DIVIDEEQUAL:
|
|
out << "DIVIDEEQUAL";
|
|
break;
|
|
|
|
case MODEQUAL:
|
|
out << "MODEQUAL";
|
|
break;
|
|
|
|
case PLUSEQUAL:
|
|
out << "PLUSEQUAL";
|
|
break;
|
|
|
|
case MINUSEQUAL:
|
|
out << "MINUSEQUAL";
|
|
break;
|
|
|
|
case OREQUAL:
|
|
out << "OREQUAL";
|
|
break;
|
|
|
|
case ANDEQUAL:
|
|
out << "ANDEQUAL";
|
|
break;
|
|
|
|
case XOREQUAL:
|
|
out << "XOREQUAL";
|
|
break;
|
|
|
|
case LSHIFTEQUAL:
|
|
out << "LSHIFTEQUAL";
|
|
break;
|
|
|
|
case RSHIFTEQUAL:
|
|
out << "RSHIFTEQUAL";
|
|
break;
|
|
|
|
case ATTR_LEFT:
|
|
out << "ATTR_LEFT";
|
|
break;
|
|
|
|
case ATTR_RIGHT:
|
|
out << "ATTR_RIGHT";
|
|
break;
|
|
|
|
case KW_ALIGNAS:
|
|
out << "KW_ALIGNAS";
|
|
break;
|
|
|
|
case KW_ALIGNOF:
|
|
out << "KW_ALIGNOF";
|
|
break;
|
|
|
|
case KW_AUTO:
|
|
out << "KW_AUTO";
|
|
break;
|
|
|
|
case KW_BEGIN_PUBLISH:
|
|
out << "KW_BEGIN_PUBLISH";
|
|
break;
|
|
|
|
case KW_BLOCKING:
|
|
out << "KW_BLOCKING";
|
|
break;
|
|
|
|
case KW_BOOL:
|
|
out << "KW_BOOL";
|
|
break;
|
|
|
|
case KW_BUILTIN_VA_LIST:
|
|
out << "KW_BUILTIN_VA_LIST";
|
|
break;
|
|
|
|
case KW_CATCH:
|
|
out << "KW_CATCH";
|
|
break;
|
|
|
|
case KW_CHAR:
|
|
out << "KW_CHAR";
|
|
break;
|
|
|
|
case KW_CHAR8_T:
|
|
out << "KW_CHAR8_T";
|
|
break;
|
|
|
|
case KW_CHAR16_T:
|
|
out << "KW_CHAR16_T";
|
|
break;
|
|
|
|
case KW_CHAR32_T:
|
|
out << "KW_CHAR32_T";
|
|
break;
|
|
|
|
case KW_CLASS:
|
|
out << "KW_CLASS";
|
|
break;
|
|
|
|
case KW_CONST:
|
|
out << "KW_CONST";
|
|
break;
|
|
|
|
case KW_CONSTEVAL:
|
|
out << "KW_CONSTEVAL";
|
|
break;
|
|
|
|
case KW_CONSTEXPR:
|
|
out << "KW_CONSTEXPR";
|
|
break;
|
|
|
|
case KW_CONSTINIT:
|
|
out << "KW_CONSTINIT";
|
|
break;
|
|
|
|
case KW_DECLTYPE:
|
|
out << "KW_DECLTYPE";
|
|
break;
|
|
|
|
case KW_DEFAULT:
|
|
out << "KW_DECLTYPE";
|
|
break;
|
|
|
|
case KW_DELETE:
|
|
out << "KW_DELETE";
|
|
break;
|
|
|
|
case KW_DOUBLE:
|
|
out << "KW_DOUBLE";
|
|
break;
|
|
|
|
case KW_DYNAMIC_CAST:
|
|
out << "KW_DYNAMIC_CAST";
|
|
break;
|
|
|
|
case KW_ELSE:
|
|
out << "KW_ELSE";
|
|
break;
|
|
|
|
case KW_ENUM:
|
|
out << "KW_ENUM";
|
|
break;
|
|
|
|
case KW_EXPLICIT:
|
|
out << "KW_EXPLICIT";
|
|
break;
|
|
|
|
case KW_EXPLICIT_LPAREN:
|
|
out << "KW_EXPLICIT_LPAREN";
|
|
break;
|
|
|
|
case KW_EXTENSION:
|
|
out << "KW_EXTENSION";
|
|
break;
|
|
|
|
case KW_EXTERN:
|
|
out << "KW_EXTERN";
|
|
break;
|
|
|
|
case KW_FALSE:
|
|
out << "KW_FALSE";
|
|
break;
|
|
|
|
case KW_FINAL:
|
|
out << "KW_FINAL";
|
|
break;
|
|
|
|
case KW_FLOAT:
|
|
out << "KW_FLOAT";
|
|
break;
|
|
|
|
case KW_FRIEND:
|
|
out << "KW_FRIEND";
|
|
break;
|
|
|
|
case KW_FOR:
|
|
out << "KW_FOR";
|
|
break;
|
|
|
|
case KW_GOTO:
|
|
out << "KW_GOTO";
|
|
break;
|
|
|
|
case KW_HAS_VIRTUAL_DESTRUCTOR:
|
|
out << "KW_HAS_VIRTUAL_DESTRUCTOR";
|
|
break;
|
|
|
|
case KW_IF:
|
|
out << "KW_IF";
|
|
break;
|
|
|
|
case KW_INLINE:
|
|
out << "KW_INLINE";
|
|
break;
|
|
|
|
case KW_INT:
|
|
out << "KW_INT";
|
|
break;
|
|
|
|
case KW_IS_ABSTRACT:
|
|
out << "KW_IS_ABSTRACT";
|
|
break;
|
|
|
|
case KW_IS_BASE_OF:
|
|
out << "KW_IS_BASE_OF";
|
|
break;
|
|
|
|
case KW_IS_CLASS:
|
|
out << "KW_IS_CLASS";
|
|
break;
|
|
|
|
case KW_IS_CONSTRUCTIBLE:
|
|
out << "KW_IS_CONSTRUCTIBLE";
|
|
break;
|
|
|
|
case KW_IS_CONVERTIBLE_TO:
|
|
out << "KW_IS_CONVERTIBLE_TO";
|
|
break;
|
|
|
|
case KW_IS_DESTRUCTIBLE:
|
|
out << "KW_IS_DESTRUCTIBLE";
|
|
break;
|
|
|
|
case KW_IS_EMPTY:
|
|
out << "KW_IS_EMPTY";
|
|
break;
|
|
|
|
case KW_IS_ENUM:
|
|
out << "KW_IS_ENUM";
|
|
break;
|
|
|
|
case KW_IS_FINAL:
|
|
out << "KW_IS_FINAL";
|
|
break;
|
|
|
|
case KW_IS_FUNDAMENTAL:
|
|
out << "KW_IS_FUNDAMENTAL";
|
|
break;
|
|
|
|
case KW_IS_POD:
|
|
out << "KW_IS_POD";
|
|
break;
|
|
|
|
case KW_IS_POLYMORPHIC:
|
|
out << "KW_IS_POLYMORPHIC";
|
|
break;
|
|
|
|
case KW_IS_STANDARD_LAYOUT:
|
|
out << "KW_IS_STANDARD_LAYOUT";
|
|
break;
|
|
|
|
case KW_IS_TRIVIAL:
|
|
out << "KW_IS_TRIVIAL";
|
|
break;
|
|
|
|
case KW_IS_TRIVIALLY_COPYABLE:
|
|
out << "KW_IS_TRIVIALLY_COPYABLE";
|
|
break;
|
|
|
|
case KW_IS_UNION:
|
|
out << "KW_IS_UNION";
|
|
break;
|
|
|
|
case KW_LONG:
|
|
out << "KW_LONG";
|
|
break;
|
|
|
|
case KW_MAKE_MAP_KEYS_SEQ:
|
|
out << "KW_MAKE_MAP_KEYS_SEQ";
|
|
break;
|
|
|
|
case KW_MAKE_MAP_PROPERTY:
|
|
out << "KW_MAKE_MAP_PROPERTY";
|
|
break;
|
|
|
|
case KW_MAKE_PROPERTY:
|
|
out << "KW_MAKE_PROPERTY";
|
|
break;
|
|
|
|
case KW_MAKE_PROPERTY2:
|
|
out << "KW_MAKE_PROPERTY2";
|
|
break;
|
|
|
|
case KW_MAKE_SEQ:
|
|
out << "KW_MAKE_SEQ";
|
|
break;
|
|
|
|
case KW_MAKE_SEQ_PROPERTY:
|
|
out << "KW_MAKE_SEQ_PROPERTY";
|
|
break;
|
|
|
|
case KW_MUTABLE:
|
|
out << "KW_MUTABLE";
|
|
break;
|
|
|
|
case KW_NAMESPACE:
|
|
out << "KW_NAMESPACE";
|
|
break;
|
|
|
|
case KW_NEW:
|
|
out << "KW_NEW";
|
|
break;
|
|
|
|
case KW_NOEXCEPT:
|
|
out << "KW_NOEXCEPT";
|
|
break;
|
|
|
|
case KW_NOEXCEPT_LPAREN:
|
|
out << "KW_NOEXCEPT_LPAREN";
|
|
break;
|
|
|
|
case KW_NULLPTR:
|
|
out << "KW_NULLPTR";
|
|
break;
|
|
|
|
case KW_OPERATOR:
|
|
if (_lval.u.identifier != nullptr) {
|
|
out << *_lval.u.identifier << "::";
|
|
}
|
|
out << "KW_OPERATOR";
|
|
break;
|
|
|
|
case KW_OVERRIDE:
|
|
out << "KW_OVERRIDE";
|
|
break;
|
|
|
|
case KW_PRIVATE:
|
|
out << "KW_PRIVATE";
|
|
break;
|
|
|
|
case KW_PROTECTED:
|
|
out << "KW_PROTECTED";
|
|
break;
|
|
|
|
case KW_PUBLIC:
|
|
out << "KW_PUBLIC";
|
|
break;
|
|
|
|
case KW_PUBLISHED:
|
|
out << "KW_PUBLISHED";
|
|
break;
|
|
|
|
case KW_REGISTER:
|
|
out << "KW_REGISTER";
|
|
break;
|
|
|
|
case KW_REINTERPRET_CAST:
|
|
out << "KW_REINTERPRET_CAST";
|
|
break;
|
|
|
|
case KW_RESTRICT:
|
|
out << "KW_RESTRICT";
|
|
break;
|
|
|
|
case KW_RETURN:
|
|
out << "KW_RETURN";
|
|
break;
|
|
|
|
case KW_SHORT:
|
|
out << "KW_SHORT";
|
|
break;
|
|
|
|
case KW_SIGNED:
|
|
out << "KW_SIGNED";
|
|
break;
|
|
|
|
case KW_SIZEOF:
|
|
out << "KW_SIZEOF";
|
|
break;
|
|
|
|
case KW_STATIC:
|
|
out << "KW_STATIC";
|
|
break;
|
|
|
|
case KW_STATIC_ASSERT:
|
|
out << "KW_STATIC_ASSERT";
|
|
break;
|
|
|
|
case KW_STATIC_CAST:
|
|
out << "KW_STATIC_CAST";
|
|
break;
|
|
|
|
case KW_STRUCT:
|
|
out << "KW_STRUCT";
|
|
break;
|
|
|
|
case KW_TEMPLATE:
|
|
out << "KW_TEMPLATE";
|
|
break;
|
|
|
|
case KW_THREAD_LOCAL:
|
|
out << "KW_THREAD_LOCAL";
|
|
break;
|
|
|
|
case KW_THROW:
|
|
out << "KW_THROW";
|
|
break;
|
|
|
|
case KW_TRUE:
|
|
out << "KW_TRUE";
|
|
break;
|
|
|
|
case KW_TRY:
|
|
out << "KW_TRY";
|
|
break;
|
|
|
|
case KW_TYPEDEF:
|
|
out << "KW_TYPEDEF";
|
|
break;
|
|
|
|
case KW_TYPEID:
|
|
out << "KW_TYPEID";
|
|
break;
|
|
|
|
case KW_TYPENAME:
|
|
out << "KW_TYPENAME";
|
|
break;
|
|
|
|
case KW_UNDERLYING_TYPE:
|
|
out << "KW_UNDERLYING_TYPE";
|
|
break;
|
|
|
|
case KW_USING:
|
|
out << "KW_USING";
|
|
break;
|
|
|
|
case KW_UNION:
|
|
out << "KW_UNION";
|
|
break;
|
|
|
|
case KW_UNSIGNED:
|
|
out << "KW_UNSIGNED";
|
|
break;
|
|
|
|
case KW_VIRTUAL:
|
|
out << "KW_VIRTUAL";
|
|
break;
|
|
|
|
case KW_VOID:
|
|
out << "KW_VOID";
|
|
break;
|
|
|
|
case KW_VOLATILE:
|
|
out << "KW_VOLATILE";
|
|
break;
|
|
|
|
case KW_WCHAR_T:
|
|
out << "KW_WCHAR_T";
|
|
break;
|
|
|
|
case KW_WHILE:
|
|
out << "KW_WHILE";
|
|
break;
|
|
|
|
case START_CPP:
|
|
out << "START_CPP";
|
|
break;
|
|
|
|
case START_CONST_EXPR:
|
|
out << "START_CONST_EXPR";
|
|
break;
|
|
|
|
case START_TYPE:
|
|
out << "START_TYPE";
|
|
break;
|
|
|
|
default:
|
|
if (_token < 128 && isprint(_token)) {
|
|
out << "'" << (char)_token << "'";
|
|
} else {
|
|
out << "token " << _token << "\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
void CPPToken::
|
|
output_code(std::ostream &out) const {
|
|
switch (_token) {
|
|
case REAL:
|
|
{
|
|
char buffer[128];
|
|
pdtoa(_lval.u.real, buffer);
|
|
out << buffer;
|
|
}
|
|
break;
|
|
|
|
case INTEGER:
|
|
out << _lval.u.integer;
|
|
break;
|
|
|
|
case CHAR_TOK:
|
|
case SIMPLE_STRING:
|
|
out << (_token == CHAR_TOK ? '\'' : '"');
|
|
for (char c : _lval.str) {
|
|
switch (c) {
|
|
case '\n':
|
|
out << "\\n";
|
|
break;
|
|
|
|
case '\t':
|
|
out << "\\t";
|
|
break;
|
|
|
|
case '\r':
|
|
out << "\\r";
|
|
break;
|
|
|
|
case '\a':
|
|
out << "\\a";
|
|
break;
|
|
|
|
case '\b':
|
|
out << "\\b";
|
|
break;
|
|
|
|
case '\v':
|
|
out << "\\v";
|
|
break;
|
|
|
|
case '\f':
|
|
out << "\\f";
|
|
break;
|
|
|
|
case '\'':
|
|
out << (_token == CHAR_TOK ? "\\\'" : "'");
|
|
break;
|
|
|
|
case '"':
|
|
out << (_token == CHAR_TOK ? "\"" : "\\\"");
|
|
break;
|
|
|
|
case '\\':
|
|
out << "\\\\";
|
|
break;
|
|
|
|
default:
|
|
if (isprint(c)) {
|
|
out << c;
|
|
} else {
|
|
out << '\\' << std::oct << std::setw(3) << std::setfill('0') << (int)(c)
|
|
<< std::dec << std::setw(0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
out << (_token == CHAR_TOK ? '\'' : '"');
|
|
break;
|
|
|
|
case STRING_LITERAL:
|
|
out << *_lval.u.expr;
|
|
break;
|
|
|
|
case SIMPLE_IDENTIFIER:
|
|
out << _lval.str;
|
|
break;
|
|
|
|
case IDENTIFIER:
|
|
out << *_lval.u.identifier;
|
|
break;
|
|
|
|
case TYPENAME_IDENTIFIER:
|
|
out << *_lval.u.identifier;
|
|
break;
|
|
|
|
case SCOPING:
|
|
out << *_lval.u.identifier << "::";
|
|
break;
|
|
|
|
case TYPEDEFNAME:
|
|
out << _lval.str;
|
|
break;
|
|
|
|
case ELLIPSIS:
|
|
out << "...";
|
|
break;
|
|
|
|
case OROR:
|
|
out << "||";
|
|
break;
|
|
|
|
case ANDAND:
|
|
out << "&&";
|
|
break;
|
|
|
|
case EQCOMPARE:
|
|
out << "==";
|
|
break;
|
|
|
|
case NECOMPARE:
|
|
out << "!=";
|
|
break;
|
|
|
|
case LECOMPARE:
|
|
out << "<=";
|
|
break;
|
|
|
|
case GECOMPARE:
|
|
out << ">=";
|
|
break;
|
|
|
|
case LSHIFT:
|
|
out << "<<";
|
|
break;
|
|
|
|
case RSHIFT:
|
|
out << ">>";
|
|
break;
|
|
|
|
case POINTSAT_STAR:
|
|
out << "->*";
|
|
break;
|
|
|
|
case DOT_STAR:
|
|
out << ".*";
|
|
break;
|
|
|
|
case UNARY_NOT:
|
|
out << "!";
|
|
break;
|
|
|
|
case UNARY_MINUS:
|
|
out << "-";
|
|
break;
|
|
|
|
case UNARY_PLUS:
|
|
out << "+";
|
|
break;
|
|
|
|
case UNARY_NEGATE:
|
|
out << "~";
|
|
break;
|
|
|
|
case UNARY_STAR:
|
|
out << "*";
|
|
break;
|
|
|
|
case UNARY_REF:
|
|
out << "&";
|
|
break;
|
|
|
|
case POINTSAT:
|
|
out << "->";
|
|
break;
|
|
|
|
case SCOPE:
|
|
out << "::";
|
|
break;
|
|
|
|
case PLUSPLUS:
|
|
out << "++";
|
|
break;
|
|
|
|
case MINUSMINUS:
|
|
out << "--";
|
|
break;
|
|
|
|
case TIMESEQUAL:
|
|
out << "*=";
|
|
break;
|
|
|
|
case DIVIDEEQUAL:
|
|
out << "/=";
|
|
break;
|
|
|
|
case MODEQUAL:
|
|
out << "%=";
|
|
break;
|
|
|
|
case PLUSEQUAL:
|
|
out << "+=";
|
|
break;
|
|
|
|
case MINUSEQUAL:
|
|
out << "-=";
|
|
break;
|
|
|
|
case OREQUAL:
|
|
out << "|=";
|
|
break;
|
|
|
|
case ANDEQUAL:
|
|
out << "&=";
|
|
break;
|
|
|
|
case XOREQUAL:
|
|
out << "^=";
|
|
break;
|
|
|
|
case LSHIFTEQUAL:
|
|
out << "<<=";
|
|
break;
|
|
|
|
case RSHIFTEQUAL:
|
|
out << ">>=";
|
|
break;
|
|
|
|
case ATTR_LEFT:
|
|
out << "[[";
|
|
break;
|
|
|
|
case ATTR_RIGHT:
|
|
out << "]]";
|
|
break;
|
|
|
|
case KW_ALIGNAS:
|
|
out << "alignas";
|
|
break;
|
|
|
|
case KW_ALIGNOF:
|
|
out << "alignof";
|
|
break;
|
|
|
|
case KW_AUTO:
|
|
out << "auto";
|
|
break;
|
|
|
|
case KW_BEGIN_PUBLISH:
|
|
out << "__begin_publish";
|
|
break;
|
|
|
|
case KW_BLOCKING:
|
|
out << "__blocking";
|
|
break;
|
|
|
|
case KW_BOOL:
|
|
out << "bool";
|
|
break;
|
|
|
|
case KW_BUILTIN_VA_LIST:
|
|
out << "__builtin_va_list";
|
|
break;
|
|
|
|
case KW_CATCH:
|
|
out << "catch";
|
|
break;
|
|
|
|
case KW_CHAR:
|
|
out << "char";
|
|
break;
|
|
|
|
case KW_CHAR8_T:
|
|
out << "char8_t";
|
|
break;
|
|
|
|
case KW_CHAR16_T:
|
|
out << "char16_t";
|
|
break;
|
|
|
|
case KW_CHAR32_T:
|
|
out << "char32_t";
|
|
break;
|
|
|
|
case KW_CLASS:
|
|
out << "class";
|
|
break;
|
|
|
|
case KW_CONST:
|
|
out << "const";
|
|
break;
|
|
|
|
case KW_CONSTEVAL:
|
|
out << "consteval";
|
|
break;
|
|
|
|
case KW_CONSTEXPR:
|
|
out << "constexpr";
|
|
break;
|
|
|
|
case KW_CONSTINIT:
|
|
out << "constinit";
|
|
break;
|
|
|
|
case KW_CONST_CAST:
|
|
out << "const_cast";
|
|
break;
|
|
|
|
case KW_DECLTYPE:
|
|
out << "decltype";
|
|
break;
|
|
|
|
case KW_DEFAULT:
|
|
out << "default";
|
|
break;
|
|
|
|
case KW_DELETE:
|
|
out << "delete";
|
|
break;
|
|
|
|
case KW_DOUBLE:
|
|
out << "double";
|
|
break;
|
|
|
|
case KW_DYNAMIC_CAST:
|
|
out << "dynamic_cast";
|
|
break;
|
|
|
|
case KW_ELSE:
|
|
out << "else";
|
|
break;
|
|
|
|
case KW_ENUM:
|
|
out << "enum";
|
|
break;
|
|
|
|
case KW_EXPLICIT:
|
|
out << "explicit";
|
|
break;
|
|
|
|
case KW_EXPLICIT_LPAREN:
|
|
out << "explicit(";
|
|
break;
|
|
|
|
case KW_EXTENSION:
|
|
out << "__extension";
|
|
break;
|
|
|
|
case KW_EXTERN:
|
|
out << "extern";
|
|
break;
|
|
|
|
case KW_FALSE:
|
|
out << "false";
|
|
break;
|
|
|
|
case KW_FINAL:
|
|
out << "final";
|
|
break;
|
|
|
|
case KW_FLOAT:
|
|
out << "float";
|
|
break;
|
|
|
|
case KW_FRIEND:
|
|
out << "friend";
|
|
break;
|
|
|
|
case KW_FOR:
|
|
out << "for";
|
|
break;
|
|
|
|
case KW_GOTO:
|
|
out << "goto";
|
|
break;
|
|
|
|
case KW_HAS_VIRTUAL_DESTRUCTOR:
|
|
out << "__has_virtual_destructor";
|
|
break;
|
|
|
|
case KW_IF:
|
|
out << "if";
|
|
break;
|
|
|
|
case KW_INLINE:
|
|
out << "inline";
|
|
break;
|
|
|
|
case KW_INT:
|
|
out << "int";
|
|
break;
|
|
|
|
case KW_IS_ABSTRACT:
|
|
out << "__is_abstract";
|
|
break;
|
|
|
|
case KW_IS_BASE_OF:
|
|
out << "__is_base_of";
|
|
break;
|
|
|
|
case KW_IS_CLASS:
|
|
out << "__is_class";
|
|
break;
|
|
|
|
case KW_IS_CONSTRUCTIBLE:
|
|
out << "__is_constructible";
|
|
break;
|
|
|
|
case KW_IS_CONVERTIBLE_TO:
|
|
out << "__is_convertible_to";
|
|
break;
|
|
|
|
case KW_IS_DESTRUCTIBLE:
|
|
out << "__is_destructible";
|
|
break;
|
|
|
|
case KW_IS_EMPTY:
|
|
out << "__is_empty";
|
|
break;
|
|
|
|
case KW_IS_ENUM:
|
|
out << "__is_enum";
|
|
break;
|
|
|
|
case KW_IS_FINAL:
|
|
out << "__is_final";
|
|
break;
|
|
|
|
case KW_IS_FUNDAMENTAL:
|
|
out << "__is_fundamental";
|
|
break;
|
|
|
|
case KW_IS_POD:
|
|
out << "__is_pod";
|
|
break;
|
|
|
|
case KW_IS_POLYMORPHIC:
|
|
out << "__is_polymorphic";
|
|
break;
|
|
|
|
case KW_IS_STANDARD_LAYOUT:
|
|
out << "__is_standard_layout";
|
|
break;
|
|
|
|
case KW_IS_TRIVIAL:
|
|
out << "__is_trivial";
|
|
break;
|
|
|
|
case KW_IS_TRIVIALLY_COPYABLE:
|
|
out << "__is_trivially_copyable";
|
|
break;
|
|
|
|
case KW_IS_UNION:
|
|
out << "__is_union";
|
|
break;
|
|
|
|
case KW_LONG:
|
|
out << "long";
|
|
break;
|
|
|
|
case KW_MAKE_MAP_KEYS_SEQ:
|
|
out << "__make_map_keys_seq";
|
|
break;
|
|
|
|
case KW_MAKE_MAP_PROPERTY:
|
|
out << "__make_map_property";
|
|
break;
|
|
|
|
case KW_MAKE_PROPERTY:
|
|
out << "__make_property";
|
|
break;
|
|
|
|
case KW_MAKE_PROPERTY2:
|
|
out << "__make_property2";
|
|
break;
|
|
|
|
case KW_MAKE_SEQ:
|
|
out << "__make_seq";
|
|
break;
|
|
|
|
case KW_MAKE_SEQ_PROPERTY:
|
|
out << "__make_seq_property";
|
|
break;
|
|
|
|
case KW_MUTABLE:
|
|
out << "mutable";
|
|
break;
|
|
|
|
case KW_NAMESPACE:
|
|
out << "namespace";
|
|
break;
|
|
|
|
case KW_NEW:
|
|
out << "new";
|
|
break;
|
|
|
|
case KW_NOEXCEPT:
|
|
out << "noexcept";
|
|
break;
|
|
|
|
case KW_NOEXCEPT_LPAREN:
|
|
out << "noexcept(";
|
|
break;
|
|
|
|
case KW_NULLPTR:
|
|
out << "nullptr";
|
|
break;
|
|
|
|
case KW_OPERATOR:
|
|
if (_lval.u.identifier != nullptr) {
|
|
out << *_lval.u.identifier << "::";
|
|
}
|
|
out << "operator";
|
|
break;
|
|
|
|
case KW_OVERRIDE:
|
|
out << "override";
|
|
break;
|
|
|
|
case KW_PRIVATE:
|
|
out << "private";
|
|
break;
|
|
|
|
case KW_PROTECTED:
|
|
out << "protected";
|
|
break;
|
|
|
|
case KW_PUBLIC:
|
|
out << "public";
|
|
break;
|
|
|
|
case KW_PUBLISHED:
|
|
out << "__published";
|
|
break;
|
|
|
|
case KW_REGISTER:
|
|
out << "register";
|
|
break;
|
|
|
|
case KW_REINTERPRET_CAST:
|
|
out << "reinterpret_cast";
|
|
break;
|
|
|
|
case KW_RESTRICT:
|
|
out << "__restrict";
|
|
break;
|
|
|
|
case KW_RETURN:
|
|
out << "return";
|
|
break;
|
|
|
|
case KW_SHORT:
|
|
out << "short";
|
|
break;
|
|
|
|
case KW_SIGNED:
|
|
out << "signed";
|
|
break;
|
|
|
|
case KW_SIZEOF:
|
|
out << "sizeof";
|
|
break;
|
|
|
|
case KW_STATIC:
|
|
out << "static";
|
|
break;
|
|
|
|
case KW_STATIC_ASSERT:
|
|
out << "static_assert";
|
|
break;
|
|
|
|
case KW_STATIC_CAST:
|
|
out << "static_cast";
|
|
break;
|
|
|
|
case KW_STRUCT:
|
|
out << "struct";
|
|
break;
|
|
|
|
case KW_TEMPLATE:
|
|
out << "template";
|
|
break;
|
|
|
|
case KW_THREAD_LOCAL:
|
|
out << "thread_local";
|
|
break;
|
|
|
|
case KW_THROW:
|
|
out << "throw";
|
|
break;
|
|
|
|
case KW_TRUE:
|
|
out << "true";
|
|
break;
|
|
|
|
case KW_TRY:
|
|
out << "try";
|
|
break;
|
|
|
|
case KW_TYPEDEF:
|
|
out << "typedef";
|
|
break;
|
|
|
|
case KW_TYPEID:
|
|
out << "typeid";
|
|
break;
|
|
|
|
case KW_TYPENAME:
|
|
out << "typename";
|
|
break;
|
|
|
|
case KW_UNDERLYING_TYPE:
|
|
out << "__underlying_type";
|
|
break;
|
|
|
|
case KW_USING:
|
|
out << "using";
|
|
break;
|
|
|
|
case KW_UNION:
|
|
out << "union";
|
|
break;
|
|
|
|
case KW_UNSIGNED:
|
|
out << "unsigned";
|
|
break;
|
|
|
|
case KW_VIRTUAL:
|
|
out << "virtual";
|
|
break;
|
|
|
|
case KW_VOID:
|
|
out << "void";
|
|
break;
|
|
|
|
case KW_VOLATILE:
|
|
out << "volatile";
|
|
break;
|
|
|
|
case KW_WCHAR_T:
|
|
out << "wchar_t";
|
|
break;
|
|
|
|
case KW_WHILE:
|
|
out << "while";
|
|
break;
|
|
|
|
case START_CPP:
|
|
case START_CONST_EXPR:
|
|
case START_TYPE:
|
|
break;
|
|
|
|
default:
|
|
if (_token < 128 && isprint(_token)) {
|
|
out << (char)_token;
|
|
} else {
|
|
out << "<token " << _token << ">\n";
|
|
}
|
|
}
|
|
}
|