--- /dev/null
+/*
+ * 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 <CxxLexing.hxx>
+%}
+%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 <CxxLexing.cxx>