cppparser: Change check_keyword() to an unordered_set lookup

This commit is contained in:
rdb 2024-03-29 13:03:26 +01:00
parent a3745af451
commit 329fa728a7
2 changed files with 128 additions and 134 deletions

View File

@ -46,6 +46,132 @@ using std::string;
// behind the preprocessor.)
static CPPVisibility preprocessor_vis = V_public;
// Don't forget to update CPPToken::output() when adding entries.
static const std::unordered_map<std::string, int> keywords = {
{"alignas", KW_ALIGNAS},
{"alignof", KW_ALIGNOF},
{"__alignof", KW_ALIGNOF},
{"__alignof__", KW_ALIGNOF},
{"auto", KW_AUTO},
{"__begin_publish", KW_BEGIN_PUBLISH},
{"__blocking", KW_BLOCKING},
{"bool", KW_BOOL},
{"__builtin_va_list", KW_BUILTIN_VA_LIST},
{"catch", KW_CATCH},
{"char", KW_CHAR},
{"char8_t", KW_CHAR8_T},
{"char16_t", KW_CHAR16_T},
{"char32_t", KW_CHAR32_T},
{"class", KW_CLASS},
{"const", KW_CONST},
{"__const", KW_CONST},
{"__const__", KW_CONST},
{"consteval", KW_CONSTEVAL},
{"constexpr", KW_CONSTEXPR},
{"constinit", KW_CONSTINIT},
{"const_cast", KW_CONST_CAST},
{"decltype", KW_DECLTYPE},
{"default", KW_DEFAULT},
{"delete", KW_DELETE},
{"double", KW_DOUBLE},
{"dynamic_cast", KW_DYNAMIC_CAST},
{"else", KW_ELSE},
{"__end_publish", KW_END_PUBLISH},
{"enum", KW_ENUM},
{"extern", KW_EXTERN},
{"__extension", KW_EXTENSION},
{"explicit", KW_EXPLICIT},
{"__published", KW_PUBLISHED},
{"false", KW_FALSE},
{"final", KW_FINAL},
{"float", KW_FLOAT},
{"friend", KW_FRIEND},
{"for", KW_FOR},
{"goto", KW_GOTO},
{"__has_virtual_destructor", KW_HAS_VIRTUAL_DESTRUCTOR},
{"if", KW_IF},
{"inline", KW_INLINE},
{"__inline", KW_INLINE},
{"__inline__", KW_INLINE},
{"int", KW_INT},
{"__is_abstract", KW_IS_ABSTRACT},
{"__is_base_of", KW_IS_BASE_OF},
{"__is_class", KW_IS_CLASS},
{"__is_constructible", KW_IS_CONSTRUCTIBLE},
{"__is_convertible_to", KW_IS_CONVERTIBLE_TO},
{"__is_destructible", KW_IS_DESTRUCTIBLE},
{"__is_empty", KW_IS_EMPTY},
{"__is_enum", KW_IS_ENUM},
{"__is_final", KW_IS_FINAL},
{"__is_fundamental", KW_IS_FUNDAMENTAL},
{"__is_pod", KW_IS_POD},
{"__is_polymorphic", KW_IS_POLYMORPHIC},
{"__is_standard_layout", KW_IS_STANDARD_LAYOUT},
{"__is_trivial", KW_IS_TRIVIAL},
{"__is_trivially_copyable", KW_IS_TRIVIALLY_COPYABLE},
{"__is_union", KW_IS_UNION},
{"long", KW_LONG},
{"__make_map_keys_seq", KW_MAKE_MAP_KEYS_SEQ},
{"__make_map_property", KW_MAKE_MAP_PROPERTY},
{"__make_property", KW_MAKE_PROPERTY},
{"__make_property2", KW_MAKE_PROPERTY2},
{"__make_seq", KW_MAKE_SEQ},
{"__make_seq_property", KW_MAKE_SEQ_PROPERTY},
{"mutable", KW_MUTABLE},
{"namespace", KW_NAMESPACE},
{"noexcept", KW_NOEXCEPT},
{"nullptr", KW_NULLPTR},
{"new", KW_NEW},
{"operator", KW_OPERATOR},
{"override", KW_OVERRIDE},
{"private", KW_PRIVATE},
{"protected", KW_PROTECTED},
{"public", KW_PUBLIC},
{"register", KW_REGISTER},
{"reinterpret_cast", KW_REINTERPRET_CAST},
//{"restrict", KW_RESTRICT},
{"__restrict", KW_RESTRICT},
{"__restrict__", KW_RESTRICT},
{"return", KW_RETURN},
{"short", KW_SHORT},
{"signed", KW_SIGNED},
{"sizeof", KW_SIZEOF},
{"static", KW_STATIC},
{"static_assert", KW_STATIC_ASSERT},
{"static_cast", KW_STATIC_CAST},
{"struct", KW_STRUCT},
{"template", KW_TEMPLATE},
{"thread_local", KW_THREAD_LOCAL},
{"throw", KW_THROW},
{"true", KW_TRUE},
{"try", KW_TRY},
{"typedef", KW_TYPEDEF},
{"typeid", KW_TYPEID},
{"typename", KW_TYPENAME},
{"__underlying_type", KW_UNDERLYING_TYPE},
{"union", KW_UNION},
{"unsigned", KW_UNSIGNED},
{"using", KW_USING},
{"virtual", KW_VIRTUAL},
{"void", KW_VOID},
{"volatile", KW_VOLATILE},
{"wchar_t", KW_WCHAR_T},
{"while", KW_WHILE},
// These are alternative ways to refer to built-in operators.
{"and", ANDAND},
{"and_eq", ANDEQUAL},
{"bitand", '&'},
{"bitor", '|'},
{"compl", '~'},
{"not", '!'},
{"not_eq", NECOMPARE},
{"or", OROR},
{"or_eq", OREQUAL},
{"xor", '^'},
{"xor_eq", XOREQUAL},
};
static int
hex_val(int c) {
switch (c) {
@ -2105,7 +2231,8 @@ get_identifier(int c) {
}
// Check for keywords.
int kw = check_keyword(name);
auto kwit = keywords.find(name);
int kw = (kwit != keywords.end()) ? (*kwit).second : 0;
// Update our internal visibility flag.
switch (kw) {
@ -2730,138 +2857,6 @@ get_number(int c) {
return get_literal(INTEGER, loc, num, result);
}
/**
*
*/
int CPPPreprocessor::
check_keyword(const string &name) {
// Don't forget to update CPPToken::output() when adding entries.
if (name == "alignas") return KW_ALIGNAS;
if (name == "alignof") return KW_ALIGNOF;
if (name == "__alignof") return KW_ALIGNOF;
if (name == "__alignof__") return KW_ALIGNOF;
if (name == "auto") return KW_AUTO;
if (name == "__begin_publish") return KW_BEGIN_PUBLISH;
if (name == "__blocking") return KW_BLOCKING;
if (name == "bool") return KW_BOOL;
if (name == "__builtin_va_list") return KW_BUILTIN_VA_LIST;
if (name == "catch") return KW_CATCH;
if (name == "char") return KW_CHAR;
if (name == "char8_t") return KW_CHAR8_T;
if (name == "char16_t") return KW_CHAR16_T;
if (name == "char32_t") return KW_CHAR32_T;
if (name == "class") return KW_CLASS;
if (name == "const") return KW_CONST;
if (name == "__const") return KW_CONST;
if (name == "__const__") return KW_CONST;
if (name == "consteval") return KW_CONSTEVAL;
if (name == "constexpr") return KW_CONSTEXPR;
if (name == "constinit") return KW_CONSTINIT;
if (name == "const_cast") return KW_CONST_CAST;
if (name == "decltype") return KW_DECLTYPE;
if (name == "default") return KW_DEFAULT;
if (name == "delete") return KW_DELETE;
if (name == "double") return KW_DOUBLE;
if (name == "dynamic_cast") return KW_DYNAMIC_CAST;
if (name == "else") return KW_ELSE;
if (name == "__end_publish") return KW_END_PUBLISH;
if (name == "enum") return KW_ENUM;
if (name == "extern") return KW_EXTERN;
if (name == "__extension") return KW_EXTENSION;
if (name == "explicit") return KW_EXPLICIT;
if (name == "__published") return KW_PUBLISHED;
if (name == "false") return KW_FALSE;
if (name == "final") return KW_FINAL;
if (name == "float") return KW_FLOAT;
if (name == "friend") return KW_FRIEND;
if (name == "for") return KW_FOR;
if (name == "goto") return KW_GOTO;
if (name == "__has_virtual_destructor") return KW_HAS_VIRTUAL_DESTRUCTOR;
if (name == "if") return KW_IF;
if (name == "inline") return KW_INLINE;
if (name == "__inline") return KW_INLINE;
if (name == "__inline__") return KW_INLINE;
if (name == "int") return KW_INT;
if (name == "__is_abstract") return KW_IS_ABSTRACT;
if (name == "__is_base_of") return KW_IS_BASE_OF;
if (name == "__is_class") return KW_IS_CLASS;
if (name == "__is_constructible") return KW_IS_CONSTRUCTIBLE;
if (name == "__is_convertible_to") return KW_IS_CONVERTIBLE_TO;
if (name == "__is_destructible") return KW_IS_DESTRUCTIBLE;
if (name == "__is_empty") return KW_IS_EMPTY;
if (name == "__is_enum") return KW_IS_ENUM;
if (name == "__is_final") return KW_IS_FINAL;
if (name == "__is_fundamental") return KW_IS_FUNDAMENTAL;
if (name == "__is_pod") return KW_IS_POD;
if (name == "__is_polymorphic") return KW_IS_POLYMORPHIC;
if (name == "__is_standard_layout") return KW_IS_STANDARD_LAYOUT;
if (name == "__is_trivial") return KW_IS_TRIVIAL;
if (name == "__is_trivially_copyable") return KW_IS_TRIVIALLY_COPYABLE;
if (name == "__is_union") return KW_IS_UNION;
if (name == "long") return KW_LONG;
if (name == "__make_map_keys_seq") return KW_MAKE_MAP_KEYS_SEQ;
if (name == "__make_map_property") return KW_MAKE_MAP_PROPERTY;
if (name == "__make_property") return KW_MAKE_PROPERTY;
if (name == "__make_property2") return KW_MAKE_PROPERTY2;
if (name == "__make_seq") return KW_MAKE_SEQ;
if (name == "__make_seq_property") return KW_MAKE_SEQ_PROPERTY;
if (name == "mutable") return KW_MUTABLE;
if (name == "namespace") return KW_NAMESPACE;
if (name == "noexcept") return KW_NOEXCEPT;
if (name == "nullptr") return KW_NULLPTR;
if (name == "new") return KW_NEW;
if (name == "operator") return KW_OPERATOR;
if (name == "override") return KW_OVERRIDE;
if (name == "private") return KW_PRIVATE;
if (name == "protected") return KW_PROTECTED;
if (name == "public") return KW_PUBLIC;
if (name == "register") return KW_REGISTER;
if (name == "reinterpret_cast") return KW_REINTERPRET_CAST;
//if (name == "restrict") return KW_RESTRICT;
if (name == "__restrict") return KW_RESTRICT;
if (name == "__restrict__") return KW_RESTRICT;
if (name == "return") return KW_RETURN;
if (name == "short") return KW_SHORT;
if (name == "signed") return KW_SIGNED;
if (name == "sizeof") return KW_SIZEOF;
if (name == "static") return KW_STATIC;
if (name == "static_assert") return KW_STATIC_ASSERT;
if (name == "static_cast") return KW_STATIC_CAST;
if (name == "struct") return KW_STRUCT;
if (name == "template") return KW_TEMPLATE;
if (name == "thread_local") return KW_THREAD_LOCAL;
if (name == "throw") return KW_THROW;
if (name == "true") return KW_TRUE;
if (name == "try") return KW_TRY;
if (name == "typedef") return KW_TYPEDEF;
if (name == "typeid") return KW_TYPEID;
if (name == "typename") return KW_TYPENAME;
if (name == "__underlying_type") return KW_UNDERLYING_TYPE;
if (name == "union") return KW_UNION;
if (name == "unsigned") return KW_UNSIGNED;
if (name == "using") return KW_USING;
if (name == "virtual") return KW_VIRTUAL;
if (name == "void") return KW_VOID;
if (name == "volatile") return KW_VOLATILE;
if (name == "wchar_t") return KW_WCHAR_T;
if (name == "while") return KW_WHILE;
// These are alternative ways to refer to built-in operators.
if (name == "and") return ANDAND;
if (name == "and_eq") return ANDEQUAL;
if (name == "bitand") return '&';
if (name == "bitor") return '|';
if (name == "compl") return '~';
if (name == "not") return '!';
if (name == "not_eq") return NECOMPARE;
if (name == "or") return OROR;
if (name == "or_eq") return OREQUAL;
if (name == "xor") return '^';
if (name == "xor_eq") return XOREQUAL;
return 0;
}
/**
*
*/

View File

@ -166,7 +166,6 @@ private:
void expand_has_include_function(std::string &expr, size_t q, size_t &p) const;
CPPToken get_number(int c);
static int check_keyword(const std::string &name);
int scan_escape_sequence(int c);
std::string scan_quoted(int c);
std::string scan_raw(int c);