+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 <stdio.h>
+#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"
-#define YYSTYPE struct ast *
-#include "y.tab.h"
-extern YYSTYPE yylval;
+#include "parse.h"
%}
+%start IN_COMMENT
+
%%
+<INITIAL>{
+\/\* BEGIN(IN_COMMENT);
+[ \n\t] ;
+\/\/.*\n? ;
if return IF;
else return ELSE;
while return WHILE;
var return VAR;
-true { yylval = ast_bool(true); return BOOL; }
-false { yylval = ast_bool(false); return BOOL; }
+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 COPEN;
\} return CCLOSE;
\; return SEMICOLON;
+\[ return SOPEN;
+\] return SCLOSE;
+\[\] return NIL;
+\. return DOT;
, return COMMA;
-'([^']|\\[abtnvfr]|\\x[0-9a-fA-F]{2})' {
- yylval = ast_char(yytext);
- return CHAR;
-}
-[0-9]+ {
- yylval = ast_int(atoi(yytext));
- return INTEGER;
+\"([^\\"]|\\(\"|{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; }
}
-[_a-zA-Z][_a-zA-Z0-9]* {
- yylval = ast_ident(yytext);
- return IDENT;
+<IN_COMMENT>{
+\*\/ BEGIN(INITIAL);
+. ;
}
-[ \n\t] ;
%%