D [0-9] H [0-9a-fA-F] E ([0\\abtnvfr]|x{H}?{H}|0[0-3]?{O}?{O}) I [a-zA-Z_] O [0-7] %option noinput %option nounput %{ #include #define YY_USER_ACTION \ yylloc.first_line = yylloc.last_line; \ yylloc.first_column = yylloc.last_column; \ for(int i = 0; yytext[i] != '\0'; i++) { \ if(yytext[i] == '\n') { \ yylloc.last_line++; \ yylloc.last_column = 0; \ } \ else { \ yylloc.last_column++; \ } \ } #include "ast.h" #include "parse.h" %} %start IN_COMMENT %% { \/\* BEGIN(IN_COMMENT); [ \n\t] ; \/\/.*\n? ; if return IF; else return ELSE; while return WHILE; var return VAR; true { yylval.expr = expr_bool(true); return BOOL; } false { yylval.expr = expr_bool(false); return BOOL; } return return RETURN; Int return TINT; Bool return TBOOL; Char return TCHAR; Void return TVOID; -> return ARROW; = return ASSIGN; ! return INVERSE; \|\| return BINOR; && return BINAND; == return EQ; != return NEQ; \<= return GEQ; \< return GE; >= return LEQ; > return LE; : return CONS; \+ return PLUS; - return MINUS; \* return TIMES; \/ return DIVIDE; % return MODULO; \^ return POWER; \( return BOPEN; \) return BCLOSE; \{ return COPEN; \} return CCLOSE; \; return SEMICOLON; \[ return SOPEN; \] return SCLOSE; \[\] return NIL; \. return DOT; , return COMMA; \"([^\\"]|\\(\"|{E}))*\" { yylval.expr = expr_string(trimquotes(yytext)); return STRING; } '([^\\']|\\('|{E}))' { yylval.expr = expr_char(trimquotes(yytext)); return CHAR; } {D}+ { yylval.expr = expr_int(atoi(yytext)); return INTEGER; } {I}({I}|{D})* { yylval.ident = safe_strdup(yytext); return IDENT; } } { \*\/ BEGIN(INITIAL); . ; } %%