2 * Title: Miniature lexer for C++ parser.
4 * File Name: CxxLexer.l
8 * This is a complete lexer for C++, intended for use with CxxParser.y.
9 * All actions are done by macros, so that there is some chance that customisation
10 * can be performed within the bounds of the CxxLexing.hxx and CxxLexing.cxx
15 #include <CxxLexing.hxx>
27 simple_escape_sequence (\\\'|\\\"|\\\?|\\\\|\\a|\\b|\\f|\\n|\\r|\\t|\\v)
28 octal_escape_sequence (\\[0-7]|\\[0-7][0-7]|\\[0-7][0-7][0-7])
29 hexadecimal_escape_sequence (\\x{hex}+)
30 escape_sequence ({simple_escape_sequence}|{octal_escape_sequence}|{hexadecimal_escape_sequence})
31 universal_character_name (\\u{hex}{hex}{hex}{hex}|\\U{hex}{hex}{hex}{hex}{hex}{hex}{hex}{hex})
32 non_digit ({letter}|{universal_character_name})
33 identifier ({non_digit}({non_digit}|{digit})*)
35 character_lit (L?\'([^\'\\\n]|\\.)*)
36 character_literal ({character_lit}\')
38 string_lit (L?\"([^\"\\\n]|\\.)*)
39 string_literal ({string_lit}\")
41 pp_number (\.?{digit}({digit}|{non_digit}|[eE][-+]|\.)*)
43 ^.*\n { LEX_SAVE_LINE(yytext, yyleng); REJECT; }
44 ^{ws}*"#".* { /* Throw away preprocessor lines - hopefully only #line and equivalent. */ }
46 {character_lit}\' { LEX_CHARACTER_TOKEN(yytext, yyleng-1); };
47 {character_lit}\\ { ERRMSG("End of line assumed to terminate character with trailing escape.");
48 LEX_CHARACTER_TOKEN(yytext, yyleng-1); };
49 {character_lit} { ERRMSG("End of line assumed to terminate character.");
50 LEX_CHARACTER_TOKEN(yytext, yyleng); };
52 {string_lit}\" { LEX_STRING_TOKEN(yytext, yyleng-1); };
53 {string_lit}\\ { ERRMSG("End of line assumed to terminate string with trailing escape.");
54 LEX_STRING_TOKEN(yytext, yyleng-1); };
55 {string_lit} { ERRMSG("End of line assumed to terminate string.");
56 LEX_STRING_TOKEN(yytext, yyleng); };
58 "asm" { LEX_STATIC_TOKEN(ASM); }
59 "auto" { LEX_STATIC_TOKEN(AUTO); }
60 "bool" { LEX_C_STATIC_TOKEN(BOOL); }
61 "break" { LEX_STATIC_TOKEN(BREAK); }
62 "case" { LEX_STATIC_TOKEN(CASE); }
63 "catch" { LEX_C_STATIC_TOKEN(CATCH); }
64 "char" { LEX_STATIC_TOKEN(CHAR); }
65 "class" { LEX_C_STATIC_TOKEN(CLASS); }
66 "const" { LEX_STATIC_TOKEN(CONST); }
67 "const_cast" { LEX_C_STATIC_TOKEN(CONST_CAST); }
68 "continue" { LEX_STATIC_TOKEN(CONTINUE); }
69 "default" { LEX_STATIC_TOKEN(DEFAULT); }
70 "delete" { LEX_C_STATIC_TOKEN(DELETE); }
71 "do" { LEX_STATIC_TOKEN(DO); }
72 "double" { LEX_STATIC_TOKEN(DOUBLE); }
73 "dynamic_cast" { LEX_C_STATIC_TOKEN(DYNAMIC_CAST); }
74 "else" { LEX_STATIC_TOKEN(ELSE); }
75 "enum" { LEX_STATIC_TOKEN(ENUM); }
76 "explicit" { LEX_C_STATIC_TOKEN(EXPLICIT); }
77 "export" { LEX_C_STATIC_TOKEN(EXPORT); }
78 "extern" { LEX_STATIC_TOKEN(EXTERN); }
79 "false" { LEX_C_STATIC_TOKEN(FALSE); }
80 "float" { LEX_STATIC_TOKEN(FLOAT); }
81 "for" { LEX_STATIC_TOKEN(FOR); }
82 "friend" { LEX_STATIC_TOKEN(FRIEND); }
83 "goto" { LEX_STATIC_TOKEN(GOTO); }
84 "if" { LEX_STATIC_TOKEN(IF); }
85 "inline" { LEX_C_STATIC_TOKEN(INLINE); }
86 "int" { LEX_STATIC_TOKEN(INT); }
87 "long" { LEX_STATIC_TOKEN(LONG); }
88 "mutable" { LEX_C_STATIC_TOKEN(MUTABLE); }
89 "namespace" { LEX_C_STATIC_TOKEN(NAMESPACE); }
90 "new" { LEX_C_STATIC_TOKEN(NEW); }
91 "operator" { LEX_C_STATIC_TOKEN(OPERATOR); }
92 "private" { LEX_C_STATIC_TOKEN(PRIVATE); }
93 "protected" { LEX_C_STATIC_TOKEN(PROTECTED); }
94 "public" { LEX_C_STATIC_TOKEN(PUBLIC); }
95 "register" { LEX_STATIC_TOKEN(REGISTER); }
96 "reinterpret_cast" { LEX_C_STATIC_TOKEN(REINTERPRET_CAST); }
97 "return" { LEX_STATIC_TOKEN(RETURN); }
98 "short" { LEX_STATIC_TOKEN(SHORT); }
99 "signed" { LEX_C_STATIC_TOKEN(SIGNED); }
100 "sizeof" { LEX_STATIC_TOKEN(SIZEOF); }
101 "static" { LEX_STATIC_TOKEN(STATIC); }
102 "static_cast" { LEX_C_STATIC_TOKEN(STATIC_CAST); }
103 "struct" { LEX_STATIC_TOKEN(STRUCT); }
104 "switch" { LEX_STATIC_TOKEN(SWITCH); }
105 "template" { LEX_C_STATIC_TOKEN(TEMPLATE); }
106 "this" { LEX_C_STATIC_TOKEN(THIS); }
107 "throw" { LEX_C_STATIC_TOKEN(THROW); }
108 "true" { LEX_C_STATIC_TOKEN(TRUE); }
109 "try" { LEX_C_STATIC_TOKEN(TRY); }
110 "typedef" { LEX_STATIC_TOKEN(TYPEDEF); }
111 "typeid" { LEX_C_STATIC_TOKEN(TYPEID); }
112 "typename" { LEX_C_STATIC_TOKEN(TYPENAME); }
113 "union" { LEX_STATIC_TOKEN(UNION); }
114 "unsigned" { LEX_STATIC_TOKEN(UNSIGNED); }
115 "using" { LEX_C_STATIC_TOKEN(USING); }
116 "virtual" { LEX_STATIC_TOKEN(VIRTUAL); }
117 "void" { LEX_STATIC_TOKEN(VOID); }
118 "volatile" { LEX_STATIC_TOKEN(VOLATILE); }
119 "wchar_t" { LEX_C_STATIC_TOKEN(WCHAR_T); }
120 "while" { LEX_STATIC_TOKEN(WHILE); }
122 "::" { LEX_C_STATIC_TOKEN(SCOPE); }
123 "..." { LEX_STATIC_TOKEN(ELLIPSIS); }
124 "<<" { LEX_STATIC_TOKEN(SHL); }
125 ">>" { LEX_STATIC_TOKEN(SHR); }
126 "==" { LEX_STATIC_TOKEN(EQ); }
127 "!=" { LEX_STATIC_TOKEN(NE); }
128 "<=" { LEX_STATIC_TOKEN(LE); }
129 ">=" { LEX_STATIC_TOKEN(GE); }
130 "&&" { LEX_STATIC_TOKEN(LOG_AND); }
131 "||" { LEX_STATIC_TOKEN(LOG_OR); }
132 "++" { LEX_STATIC_TOKEN(INC); }
133 "--" { LEX_STATIC_TOKEN(DEC); }
134 "->*" { LEX_STATIC_TOKEN(ARROW_STAR); }
135 "->" { LEX_STATIC_TOKEN(ARROW); }
136 ".*" { LEX_STATIC_TOKEN(DOT_STAR); }
137 "+=" { LEX_STATIC_TOKEN(ASS_ADD); }
138 "-=" { LEX_STATIC_TOKEN(ASS_SUB); }
139 "*=" { LEX_STATIC_TOKEN(ASS_MUL); }
140 "/=" { LEX_STATIC_TOKEN(ASS_DIV); }
141 "%=" { LEX_STATIC_TOKEN(ASS_MOD); }
142 "^=" { LEX_STATIC_TOKEN(ASS_XOR); }
143 "&=" { LEX_STATIC_TOKEN(ASS_AND); }
144 "|=" { LEX_STATIC_TOKEN(ASS_OR); }
145 ">>=" { LEX_STATIC_TOKEN(ASS_SHR); }
146 "<<=" { LEX_STATIC_TOKEN(ASS_SHL); }
148 {pp_number} { LEX_NUMBER_TOKEN(yytext, yyleng); }
150 {identifier} { LEX_IDENTIFIER_TOKEN(yytext, yyleng); }
153 {universal_character_name} { LEX_ESCAPED_TOKEN(yytext, yyleng); }
156 {ws}+ { /* Throw away whitespace */ }
157 . { LEX_ASCII_TOKEN(yytext[0]); }
160 #include <CxxLexing.cxx>