%option nounput %option bison-locations %{ #include "parser.tab.hh" #include using namespace std; static string build_string; %} %x str %% /* operators */ := return ASSIGN; ::= return DASSIGN; == return DEQUALS; \/ return DIVIDE; = return EQUALS; \> return GREATER; \< return LESS; =~ return MATCH; - return MINUS; % return MOD; \+ return PLUS; \* return STAR; /* punctuation */ : return COLON; , return COMMA; :: return DCOLON; \$ return DOLLAR; \. return DOT; \<- return FROM; \? return QUESTION; ; return SEMICOLON; \{ return LCURLY; \} return RCURLY; \[ return LBRACKET; \] return RBRACKET; \( return LPAREN; \) return RPAREN; /* literals */ [0-9]+ { return INT_LITERAL; } 0x[0-9A-Fa-f]+ { return INT_LITERAL; } 0b[01]+ { return INT_LITERAL; } [0-9]*\.[0-9]+([eE]-?[0-9]+)? { return REAL_LITERAL; } /* primitive types */ byte return BYTE; ubyte return UBYTE; char return CHAR; wchar return WCHAR; short return SHORT; ushort return USHORT; int return INT; uint return UINT; long return LONG; ulong return ULONG; float return FLOAT; double return DOUBLE; /* keywords */ import return IMPORT; module return MODULE; return return RETURN; struct return STRUCT; /* identifiers */ [a-zA-Z_][a-zA-Z_0-9]* { return IDENTIFIER; } /* strings */ \" build_string = ""; BEGIN(str); { \" { /* end of the string literal */ BEGIN(INITIAL); return STRING_LITERAL; } \\x[0-9A-Fa-f]{2} { /* hexadecimal escape code */ unsigned int val; (void) sscanf(yytext + 2, "%x", &val); build_string += (char) val; } \\n build_string += '\n'; \\t build_string += '\t'; \\r build_string += '\r'; \\b build_string += '\b'; \\f build_string += '\f'; \\(.|\n) build_string += yytext[1]; [^\\\"]+ build_string += yytext; } /* whitespace */ \n yylloc->first_line++; yylloc->last_line++; [ \t\v] /* ignore whitespace */ /* anything else */ . return yytext[0]; %%