open_toontown_panda3d/dtool/src/cppparser/cppToken.cxx

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";
}
}
}