%option nounput %option bison-locations %{ #include "parser.h" #include "parser.tab.h" #include "String.h" #define YY_USER_ACTION yylloc->first_column += yyleng; static String * build_string = NULL; %} %x str %% \+ return TOK_PLUS; - return TOK_MINUS; \* return TOK_TIMES; \/ return TOK_DIVIDE; % return TOK_MOD; \^ return TOK_XOR; = return TOK_ASSIGN; == return TOK_EQUALS; != return TOK_NOTEQUALS; \< return TOK_LESS; \<= return TOK_LESSEQ; \> return TOK_GREATER; \>= return TOK_GREATEREQ; && return TOK_AND; \|\| return TOK_OR; ! return TOK_NOT; ; return TOK_SEMICOLON; : return TOK_COLON; \? return TOK_QUESTION; \. return TOK_DOT; , return TOK_COMMA; \{ return TOK_LCURLY; \} return TOK_RCURLY; \[ return TOK_LBRACKET; \] return TOK_RBRACKET; \( return TOK_LPAREN; \) return TOK_RPAREN; void return TOK_VOID; char return TOK_CHAR; short return TOK_SHORT; int return TOK_INT; long return TOK_LONG; float return TOK_FLOAT; double return TOK_DOUBLE; signed return TOK_SIGNED; unsigned return TOK_UNSIGNED; volatile return TOK_VOLATILE; static return TOK_STATIC; const return TOK_CONST; extern return TOK_EXTERN; auto return TOK_AUTO; register return TOK_REGISTER; inline return TOK_INLINE; struct return TOK_STRUCT; union return TOK_UNION; enum return TOK_ENUM; typedef return TOK_TYPEDEF; if return TOK_IF; else return TOK_ELSE; while return TOK_WHILE; for return TOK_FOR; do return TOK_DO; goto return TOK_GOTO; return return TOK_RETURN; switch return TOK_SWITCH; case return TOK_CASE; default return TOK_DEFAULT; break return TOK_BREAK; continue return TOK_CONTINUE; sizeof return TOK_SIZEOF; '[^\\]' return TOK_CHAR_CONST; '\\.' return TOK_CHAR_CONST; '\\n' (void)'\n'; return TOK_CHAR_CONST; '\\t' (void)'\t'; return TOK_CHAR_CONST; '\\r' (void)'\r'; return TOK_CHAR_CONST; '\\b' (void)'\b'; return TOK_CHAR_CONST; '\\f' (void)'\f'; return TOK_CHAR_CONST; [0-9]+([uU][lL]?[lL]?)? return TOK_INT_CONST; 0[xX][0-9a-fA-F]+([uU][lL]?[lL]?)? return TOK_INT_CONST; [0-9]*\.[0-9]*[fF]? return TOK_FLOAT_CONST; \" { if (build_string != NULL) { String_free(build_string); } build_string = String_new(""); BEGIN(str); } { \" { BEGIN(INITIAL); return TOK_STR_CONST; } \\x[0-9A-Fa-f]{2} { /* hexadecimal escape code */ unsigned int val; (void) sscanf(yytext + 2, "%x", &val); char v[2] = {(char)val, '\0'}; String_concat(build_string, v); } \\n String_concat(build_string, "\n"); \\t String_concat(build_string, "\t"); \\r String_concat(build_string, "\r"); \\b String_concat(build_string, "\b"); \\f String_concat(build_string, "\f"); \\. String_concat(build_string, &yytext[1]); [^\\\"]+ String_concat(build_string, yytext); } [a-zA-Z_][a-zA-Z_0-9]* return TOK_IDENTIFIER; ^[ ]*#[ ]+[0-9]+[ ]+\".+\".*$ { } \n { yylloc->first_line++; yylloc->first_column = 0; yylloc->last_line++; yylloc->last_column = 0; } [ \t\v] /* ignore whitespace */ %%