diff options
Diffstat (limited to 'src/frontend/lexer.l')
-rw-r--r-- | src/frontend/lexer.l | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/frontend/lexer.l b/src/frontend/lexer.l new file mode 100644 index 0000000..5b72086 --- /dev/null +++ b/src/frontend/lexer.l @@ -0,0 +1,47 @@ +/*** definition section ***/ +%{ + /* C to be copied verbatim */ + #include "parser.h" +%} + +/* read only one input file */ +%option noyywrap +%option yylineno + +DIGIT [0-9] +ALPHA [[:alpha:]_] + +/*** rules section ***/ +%% + +"(" {return L_PAREN;} +")" {return R_PAREN;} +"{" {return L_BRACK;} +"}" {return R_BRACK;} +";" {return SEMI_COL;} +"~" {return COMP;} +"*" {return MULT;} +"/" {return DIV;} +"%" {return MOD;} +"-" {return MINUS;} +"+" {return PLUS;} + +"int" {return INT;} +"void" {return VOID;} +"return" {return RET;} + +{DIGIT}+ {yylval.ival = atol(yytext); return NUMBER;} +{ALPHA}+ { + yylval.sval = strdup(yytext); + return WORD; + } + +[[:space:]]+ {/* discard */} +. { + printf("Error at line %d: unrecognized symbol \"%s\"\n", yylineno, yytext); + return YYerror; +} + +%% + +/*** C section ***/ |