1 #include <sngcpp/lexer/CppLexerApi.hpp>
  2 #include <sngcpp/ast/SourceCodeWriter.hpp>
  3 
  4 classmap CppTokenLexerClassMap;
  5 
  6 prefix "sngcpp/lexer";
  7 
  8 tokens CppTokenLexerTokens
  9 {
 10     (ALIGNAS, "'alignas'"), (ALIGNOF, "'alignof'"), (ASM, "'asm'"), (AUTO, "'auto'"), (BOOL, "'bool'"), (BREAK, "'break'"), (CASE, "'case'"), (CATCH, "'catch'"), 
 11     (CHAR, "'char'"), (CHAR8_T, "'char8_t'"), (CHAR16_T, "'char16_t'"), (CHAR32_T, "'char32_t'"), (CLASS, "'class'"), (CONCEPT, "'concept'"), (CONST, "'const'"),
 12     (CONSTEVAL, "'consteval'"), (CONSTEXPR, "'constexpr'"),
 13     (CONSTINIT, "'constinit'"), (CONST_CAST, "'const_cast'"), (CONTINUE, "'continue'"), (CO_AWAIT, "'co_await'"), (CO_RETURN, "'co_return'"), (CO_YIELD, "'co_yield'"),
 14     (DECLTYPE, "'decltype'"), (DEFAULT, "'default'"), (DELETE, "'delete'"), (DO, "'do'"), (DOUBLE, "'double'"), (DYNAMIC_CAST, "'dynamic_cast'"), (ELSE, "'else'"),
 15     (ENUM, "'enum'"), (EXPLICIT, "'explicit'"), (EXPORT, "'export'"), (EXTERN, "'extern'"),
 16     (FALSE, "'false'"), (FLOAT, "'float'"), (FOR, "'for'"), (FRIEND, "'friend'"), (GOTO, "'goto'"), (IF, "'if'"), (INLINE, "'inline'"), (INT, "'int'"), (LONG, "'long'"),
 17     (MUTABLE, "'mutable'"), (NAMESPACE, "'namespace'"), (NEW, "'new'"), (NOEXCEPT, "'noexcept'"), (NULLPTR, "'nullptr'"), (OPERATOR, "'operator'"), (PRIVATE, "'private'"),
 18     (PROTECTED, "'protected'"),
 19     (PUBLIC, "'public'"), (REGISTER, "'register'"), (REINTERPRET_CAST, "'reinterpret_cast'"), (REQUIRES, "'requires'"), (RETURN, "'return'"), (SHORT, "'short'"), (SIGNED, "'signed'"),
 20     (SIZEOF, "'sizeof'"), (STATIC, "'static'"), (STATIC_ASSERT, "'static_assert'"), (STATIC_CAST, "'static_cast'"), (STRUCT, "'struct'"), (SWITCH, "'switch'"), (TEMPLATE, "'template'"),
 21     (THIS, "'this'"), (THREAD_LOCAL, "'thread_local'"), (THROW, "'throw'"),
 22     (TRUE, "'true'"), (TRY, "'try'"), (TYPEDEF, "'typedef'"), (TYPEID, "'typeid'"), (TYPENAME, "'typename'"), (UNION, "'union'"), (UNSIGNED, "'unsigned'"), (USING, "'using'"),
 23     (VIRTUAL, "'virtual'"), (VOID, "'void'"), (VOLATILE, "'volatile'"), (WCHAR_T, "'wchar_t'"), (WHILE, "'while'"),
 24     (OVERRIDE, "'override'"), (FINAL, "'final'"), (__DECLSPEC, "'__declspec'"), (__THREAD, "'__thread'"),
 25     (FLOATLIT, "floating literal"), (INTLIT, "integer literal"), (CHARLIT, "character literal"), (STRINGLIT, "string literal"),
 26     (COLONCOLON, "'::'"), (COMMA, "','"), (ASSIGN, "'='"), (MULASSIGN, "'*='"), (DIVASSIGN, "'/='"), (REMASSIGN, "'%='"), (ADDASSIGN, "'+='"), (SUBASSIGN, "'-='"),
 27     (SHIFTRIGHTASSIGN, "'>>='"), (SHIFTLEFTASSIGN, "'<<='"), (ANDASSIGN, "'&='"), (XORASSIGN, "'^='"), (ORASSIGN, "'|='"), (QUEST, "'?'"), (COLON, "':'"),
 28     (OROR, "'||'"), (AMPAMP, "'&&'"), (OR, "'|'"), (XOR, "'^'"), (AMP, "'&'"), (EQ, "'=='"), (NEQ, "'!='"), (LEQ, "'<='"), (GEQ, "'>='"), (SPACESHIP, "<=>"), (LANGLE, "'<'"), (RANGLE, "'>'"),
 29     (SHIFTLEFT, "'<<'"), (SHIFTRIGHT, "'>>'"), (PLUS, "'+'"), (MINUS, "'-'"), (STAR, "'*'"), (DIV, "'/'"), (MOD, "'%'"), (DOTSTAR, "'.*'"), (ARROWSTAR, "'->*'"), (LPAREN, "'('"), (RPAREN, "')'"),
 30     (PLUSPLUS, "'++'"), (MINUSMINUS, "'--'"), (EXCLAMATION, "'!'"), (TILDE, "'~'"), 
 31     (LBRACKET, "'['"), (RBRACKET, "']'"), (LBRACE, "'{'"), (RBRACE, "'}'"), (DOT, "'.'"), (ARROW, "'->'"), (SEMICOLON, "';'"), (ELLIPSES, "'...'"),
 32     (WS, "white space"), (LINECOMMENT, "line comment"), (BLOCKCOMMENT, "block comment"), (BLOCKCOMMENTLINE, "block comment line"),
 33     (KEYWORD, "keyword"), (ID, "identifier"), (NUMBER, "number"), (PP, "pp"), (OTHER, "other"),
 34     (MAX, "max")
 35 }
 36 
 37 keywords CppTokenLexerKeywords
 38 {
 39     ("alignas", ALIGNAS), ("alignof", ALIGNOF), ("asm", ASM), ("auto", AUTO), ("bool", BOOL), ("break", BREAK), ("case", CASE), ("catch", CATCH),
 40     ("char", CHAR), ("char8_t", CHAR8_T), ("char16_t", CHAR16_T), ("char32_t", CHAR32_T), ("class", CLASS), ("concept", CONCEPT), ("const", CONST),
 41     ("consteval", CONSTEVAL), ("constexpr", CONSTEXPR),
 42     ("constinit", CONSTINIT), ("const_cast", CONST_CAST), ("continue", CONTINUE), ("co_await", CO_AWAIT), ("co_return", CO_RETURN), ("co_yield", CO_YIELD),
 43     ("decltype", DECLTYPE), ("default", DEFAULT), ("delete", DELETE), ("do", DO), ("double", DOUBLE), ("dynamic_cast", DYNAMIC_CAST), ("else", ELSE),
 44     ("enum", ENUM), ("explicit", EXPLICIT), ("export", EXPORT), ("extern", EXTERN),
 45     ("false", FALSE), ("float", FLOAT), ("for", FOR), ("friend", FRIEND), ("goto", GOTO), ("if", IF), ("inline", INLINE), ("int", INT), ("long", LONG),
 46     ("mutable", MUTABLE), ("namespace", NAMESPACE), ("new", NEW), ("noexcept", NOEXCEPT), ("nullptr", NULLPTR), ("operator", OPERATOR), ("private", PRIVATE),
 47     ("protected", PROTECTED),
 48     ("public", PUBLIC), ("register", REGISTER), ("reinterpret_cast", REINTERPRET_CAST), ("requires", REQUIRES), ("return", RETURN), ("short", SHORT), ("signed", SIGNED),
 49     ("sizeof", SIZEOF), ("static", STATIC), ("static_assert", STATIC_ASSERT), ("static_cast", STATIC_CAST), ("struct", STRUCT), ("switch", SWITCH), ("template", TEMPLATE),
 50     ("this", THIS), ("thread_local", THREAD_LOCAL), ("throw", THROW),
 51     ("true", TRUE), ("try", TRY), ("typedef", TYPEDEF), ("typeid", TYPEID), ("typename", TYPENAME), ("union", UNION), ("unsigned", UNSIGNED), ("using", USING),
 52     ("virtual", VIRTUAL), ("void", VOID), ("volatile", VOLATILE), ("wchar_t", WCHAR_T), ("while", WHILE), ("override", OVERRIDE), ("final", FINAL),
 53     ("__thread", __THREAD), ("__declspec", __DECLSPEC)
 54 }
 55 
 56 expressions
 57 {
 58     ws = "[\t ]+";
 59     newline = "\r\n|\n|\r";
 60     linecomment = "//[^\n\r]*{newline}";
 61     blockcomment = "/\*([^*\n\r]|\*[^/\n\r])*(\*/|{newline})";
 62     blockcommentline = "([^*\n\r]|\*[^/\n\r])*(\*/|{newline})";
 63     id = "{idstart}{idcont}*";
 64     digit = "[0-9]";
 65     nondigit = "[a-zA-Z_]";
 66     hexdigit = "[0-9a-fA-F]";
 67     hexquad = "{hexdigit}{hexdigit}{hexdigit}{hexdigit}";
 68     universalcharactername = "\\u{hexquad}|\\U{hexquad}{hexquad}";
 69     identifiernondigit = "{nondigit}|{universalcharactername}";
 70     sign = "\+|-";
 71     ppnumber = "({digit}+\.?|\.{digit}+)([eE]{sign}|{identifiernondigit})*";
 72     octaldigit = "[0-7]";
 73     simpleescape = "\\['\"\?\\abfnrtv]";
 74     octalescape = "\\{octaldigit}|\\{octaldigit}{octaldigit}|\\{octaldigit}{octaldigit}{octaldigit}";
 75     hexescape = "\\x{hexdigit}+";
 76     escape = "{simpleescape}|{octalescape}|{hexescape}";
 77     cchar = "[^\r\n\\']|{escape}|{universalcharactername}";
 78     characterliteral = "[uUL]?'{cchar}+'";
 79     encodingprefix = "u8|u|U|L";
 80     schar = "[^\r\n\\\"]|{escape}|{universalcharactername}";
 81     stringliteral = "{encodingprefix}?\"{schar}*\"|{encodingprefix}?R\"[^\n\r\"]*\"";
 82 }
 83 
 84 lexer api(SNGCPP_LEXER_API) CppTokenLexer
 85 {
 86     "{ws}" { return WS; }
 87     "{newline}" { }
 88     "{linecomment}" { return LINECOMMENT; }
 89     "{blockcomment}" { return BLOCKCOMMENT; }
 90     "{blockcommentline}" $(1) { return BLOCKCOMMENTLINE; }
 91     "{id}" { if (GetKeywordToken(token.match) != INVALID_TOKEN) return KEYWORD; else return ID; }
 92     "{characterliteral}" { return CHARLIT; }
 93     "{stringliteral}" { return STRINGLIT; }
 94     "{ppnumber}" { return NUMBER; }
 95     "{ws}*#[^\x0\r\n]*" { return PP; }
 96     "::" { return OTHER; }
 97     "," { return OTHER; }
 98     "=" { return OTHER; }
 99     "\*=" { return OTHER; }
100     "/=" { return OTHER; }
101     "%=" { return OTHER; }
102     "\+=" { return OTHER; }
103     "-=" { return OTHER; }
104     ">>=" { return OTHER; }
105     "<<=" { return OTHER; }
106     "&=" { return OTHER; }
107     "^=" { return OTHER; }
108     "\|=" { return OTHER; }
109     "\?" { return OTHER; }
110     ":" { return OTHER; }
111     "\|\|" { return OTHER; }
112     "&&" { return OTHER; }
113     "\|" { return OTHER; }
114     "^" { return OTHER; }
115     "&" { return OTHER; }
116     "==" { return OTHER; }
117     "!=" { return OTHER; }
118     "<=" { return OTHER; }
119     ">=" { return OTHER; }
120     "<=>" { return OTHER; }
121     "<" { return OTHER; }
122     ">" { return OTHER; }
123     "<<" { return OTHER; }
124     ">>" { return OTHER; }
125     "\+" { return OTHER; }
126     "-" { return OTHER; }
127     "\*" { return OTHER; }
128     "/" { return OTHER; }
129     "%" { return OTHER; }
130     "\.\*" { return OTHER; }
131     "->\*" { return OTHER; }
132     "\(" { return OTHER; }
133     "\)" { return OTHER; }
134     "\+\+" { return OTHER; }
135     "--" { return OTHER; }
136     "!" { return OTHER; }
137     "~" { return OTHER; }
138     "\[" { return OTHER; }
139     "\]" { return OTHER; }
140     "\." { return OTHER; }
141     "->" { return OTHER; }
142     ";" { return OTHER; }
143     "\.\.\." { return OTHER; }
144     "\{" { return OTHER; }
145     "\}" { return OTHER; }
146 
147     actions
148     {
149         $(1)={ if (!inBlockComment) return INVALID_TOKEN; }
150     }
151 
152     variables
153     {
154         bool inBlockComment;
155         sngcpp::ast::SourceCodeWriter* writer;
156     }
157 }