/* * Title: Miniature lexer for C++ parser. * * File Name: CxxLexer.l * * Author: E.D.Willink * * This is a complete lexer for C++, intended for use with CxxParser.y. * All actions are done by macros, so that there is some chance that customisation * can be performed within the bounds of the CxxLexing.hxx and CxxLexing.cxx * include files. *END */ %{ #include %} %a 5000 %e 1500 %n 1000 %o 10000 %p 10000 ws [ \f\v\t] digit [0-9] hex [0-9A-Fa-f] letter [A-Z_a-z] simple_escape_sequence (\\\'|\\\"|\\\?|\\\\|\\a|\\b|\\f|\\n|\\r|\\t|\\v) octal_escape_sequence (\\[0-7]|\\[0-7][0-7]|\\[0-7][0-7][0-7]) hexadecimal_escape_sequence (\\x{hex}+) escape_sequence ({simple_escape_sequence}|{octal_escape_sequence}|{hexadecimal_escape_sequence}) universal_character_name (\\u{hex}{hex}{hex}{hex}|\\U{hex}{hex}{hex}{hex}{hex}{hex}{hex}{hex}) non_digit ({letter}|{universal_character_name}) identifier ({non_digit}({non_digit}|{digit})*) character_lit (L?\'([^\'\\\n]|\\.)*) character_literal ({character_lit}\') string_lit (L?\"([^\"\\\n]|\\.)*) string_literal ({string_lit}\") pp_number (\.?{digit}({digit}|{non_digit}|[eE][-+]|\.)*) %% ^.*\n { LEX_SAVE_LINE(yytext, yyleng); REJECT; } ^{ws}*"#".* { /* Throw away preprocessor lines - hopefully only #line and equivalent. */ } {character_lit}\' { LEX_CHARACTER_TOKEN(yytext, yyleng-1); }; {character_lit}\\ { ERRMSG("End of line assumed to terminate character with trailing escape."); LEX_CHARACTER_TOKEN(yytext, yyleng-1); }; {character_lit} { ERRMSG("End of line assumed to terminate character."); LEX_CHARACTER_TOKEN(yytext, yyleng); }; {string_lit}\" { LEX_STRING_TOKEN(yytext, yyleng-1); }; {string_lit}\\ { ERRMSG("End of line assumed to terminate string with trailing escape."); LEX_STRING_TOKEN(yytext, yyleng-1); }; {string_lit} { ERRMSG("End of line assumed to terminate string."); LEX_STRING_TOKEN(yytext, yyleng); }; "asm" { LEX_STATIC_TOKEN(ASM); } "auto" { LEX_STATIC_TOKEN(AUTO); } "bool" { LEX_C_STATIC_TOKEN(BOOL); } "break" { LEX_STATIC_TOKEN(BREAK); } "case" { LEX_STATIC_TOKEN(CASE); } "catch" { LEX_C_STATIC_TOKEN(CATCH); } "char" { LEX_STATIC_TOKEN(CHAR); } "class" { LEX_C_STATIC_TOKEN(CLASS); } "const" { LEX_STATIC_TOKEN(CONST); } "const_cast" { LEX_C_STATIC_TOKEN(CONST_CAST); } "continue" { LEX_STATIC_TOKEN(CONTINUE); } "default" { LEX_STATIC_TOKEN(DEFAULT); } "delete" { LEX_C_STATIC_TOKEN(DELETE); } "do" { LEX_STATIC_TOKEN(DO); } "double" { LEX_STATIC_TOKEN(DOUBLE); } "dynamic_cast" { LEX_C_STATIC_TOKEN(DYNAMIC_CAST); } "else" { LEX_STATIC_TOKEN(ELSE); } "enum" { LEX_STATIC_TOKEN(ENUM); } "explicit" { LEX_C_STATIC_TOKEN(EXPLICIT); } "export" { LEX_C_STATIC_TOKEN(EXPORT); } "extern" { LEX_STATIC_TOKEN(EXTERN); } "false" { LEX_C_STATIC_TOKEN(FALSE); } "float" { LEX_STATIC_TOKEN(FLOAT); } "for" { LEX_STATIC_TOKEN(FOR); } "friend" { LEX_STATIC_TOKEN(FRIEND); } "goto" { LEX_STATIC_TOKEN(GOTO); } "if" { LEX_STATIC_TOKEN(IF); } "inline" { LEX_C_STATIC_TOKEN(INLINE); } "int" { LEX_STATIC_TOKEN(INT); } "long" { LEX_STATIC_TOKEN(LONG); } "mutable" { LEX_C_STATIC_TOKEN(MUTABLE); } "namespace" { LEX_C_STATIC_TOKEN(NAMESPACE); } "new" { LEX_C_STATIC_TOKEN(NEW); } "operator" { LEX_C_STATIC_TOKEN(OPERATOR); } "private" { LEX_C_STATIC_TOKEN(PRIVATE); } "protected" { LEX_C_STATIC_TOKEN(PROTECTED); } "public" { LEX_C_STATIC_TOKEN(PUBLIC); } "register" { LEX_STATIC_TOKEN(REGISTER); } "reinterpret_cast" { LEX_C_STATIC_TOKEN(REINTERPRET_CAST); } "return" { LEX_STATIC_TOKEN(RETURN); } "short" { LEX_STATIC_TOKEN(SHORT); } "signed" { LEX_C_STATIC_TOKEN(SIGNED); } "sizeof" { LEX_STATIC_TOKEN(SIZEOF); } "static" { LEX_STATIC_TOKEN(STATIC); } "static_cast" { LEX_C_STATIC_TOKEN(STATIC_CAST); } "struct" { LEX_STATIC_TOKEN(STRUCT); } "switch" { LEX_STATIC_TOKEN(SWITCH); } "template" { LEX_C_STATIC_TOKEN(TEMPLATE); } "this" { LEX_C_STATIC_TOKEN(THIS); } "throw" { LEX_C_STATIC_TOKEN(THROW); } "true" { LEX_C_STATIC_TOKEN(TRUE); } "try" { LEX_C_STATIC_TOKEN(TRY); } "typedef" { LEX_STATIC_TOKEN(TYPEDEF); } "typeid" { LEX_C_STATIC_TOKEN(TYPEID); } "typename" { LEX_C_STATIC_TOKEN(TYPENAME); } "union" { LEX_STATIC_TOKEN(UNION); } "unsigned" { LEX_STATIC_TOKEN(UNSIGNED); } "using" { LEX_C_STATIC_TOKEN(USING); } "virtual" { LEX_STATIC_TOKEN(VIRTUAL); } "void" { LEX_STATIC_TOKEN(VOID); } "volatile" { LEX_STATIC_TOKEN(VOLATILE); } "wchar_t" { LEX_C_STATIC_TOKEN(WCHAR_T); } "while" { LEX_STATIC_TOKEN(WHILE); } "::" { LEX_C_STATIC_TOKEN(SCOPE); } "..." { LEX_STATIC_TOKEN(ELLIPSIS); } "<<" { LEX_STATIC_TOKEN(SHL); } ">>" { LEX_STATIC_TOKEN(SHR); } "==" { LEX_STATIC_TOKEN(EQ); } "!=" { LEX_STATIC_TOKEN(NE); } "<=" { LEX_STATIC_TOKEN(LE); } ">=" { LEX_STATIC_TOKEN(GE); } "&&" { LEX_STATIC_TOKEN(LOG_AND); } "||" { LEX_STATIC_TOKEN(LOG_OR); } "++" { LEX_STATIC_TOKEN(INC); } "--" { LEX_STATIC_TOKEN(DEC); } "->*" { LEX_STATIC_TOKEN(ARROW_STAR); } "->" { LEX_STATIC_TOKEN(ARROW); } ".*" { LEX_STATIC_TOKEN(DOT_STAR); } "+=" { LEX_STATIC_TOKEN(ASS_ADD); } "-=" { LEX_STATIC_TOKEN(ASS_SUB); } "*=" { LEX_STATIC_TOKEN(ASS_MUL); } "/=" { LEX_STATIC_TOKEN(ASS_DIV); } "%=" { LEX_STATIC_TOKEN(ASS_MOD); } "^=" { LEX_STATIC_TOKEN(ASS_XOR); } "&=" { LEX_STATIC_TOKEN(ASS_AND); } "|=" { LEX_STATIC_TOKEN(ASS_OR); } ">>=" { LEX_STATIC_TOKEN(ASS_SHR); } "<<=" { LEX_STATIC_TOKEN(ASS_SHL); } {pp_number} { LEX_NUMBER_TOKEN(yytext, yyleng); } {identifier} { LEX_IDENTIFIER_TOKEN(yytext, yyleng); } {escape_sequence} | {universal_character_name} { LEX_ESCAPED_TOKEN(yytext, yyleng); } \n | {ws}+ { /* Throw away whitespace */ } . { LEX_ASCII_TOKEN(yytext[0]); } %% #include