%{ #include "parser.tab.h" #include "node.h" #include #include extern int errors; %} %option yylineno DEC_DIGIT [0-9] HEX_DIGIT [0-9a-fA-F] OCT_DIGIT [0-8] DEC_INTEGER [+-]?(0|[1-9]{DEC_DIGIT}*) HEX_INTEGER [+-]?0[xX]{HEX_DIGIT}+ OCT_INTEGER [+-]?0{OCT_DIGIT}+ FLOAT [+-]?{DEC_DIGIT}*\.{DEC_DIGIT}+([eE][-+]?{DEC_DIGIT}+)? NEWLINE (\n|\r\n) WHITE_SPACE [ \t] SEMI ";" COMMA "," ASSIGNOP "=" PLUS "+" MINUS "-" TIMES "*" DIV "/" AND "&&" OR "||" DOT "." NOT "!" LP "(" RP ")" LB "[" RB "]" LC "{" RC "}" STRUCT "struct" RETURN "return" IF "if" ELSE "else" WHILE "while" TYPE_INT "int" TYPE_FLOAT "float" ID [a-zA-Z_][a-zA-Z0-9_]* LINE_COMMENT \/\/.*$ BLOCK_COMMENT \/\*(.|\n)*?\*\/ %% {SEMI} { yylval = newNode(Semi, yylineno, 0, NULL, nullValue()); return SEMI; } {COMMA} { yylval = newNode(Comma, yylineno, 0, NULL, nullValue()); return COMMA; } {ASSIGNOP} { yylval = newNode(Assignop, yylineno, 0, NULL, nullValue()); return ASSIGNOP; } {PLUS} { yylval = newNode(Plus, yylineno, 0, NULL, nullValue()); return PLUS; } {MINUS} { yylval = newNode(Minus, yylineno, 0, NULL, nullValue()); return MINUS; } {TIMES} { yylval = newNode(Times, yylineno, 0, NULL, nullValue()); return TIMES; } {DIV} { yylval = newNode(Div, yylineno, 0, NULL, nullValue()); return DIV; } {AND} { yylval = newNode(And, yylineno, 0, NULL, nullValue()); return AND; } {OR} { yylval = newNode(Or, yylineno, 0, NULL, nullValue()); return OR; } {DOT} { yylval = newNode(Dot, yylineno, 0, NULL, nullValue()); return DOT; } {NOT} { yylval = newNode(Not, yylineno, 0, NULL, nullValue()); return NOT; } {LP} { yylval = newNode(Lp, yylineno, 0, NULL, nullValue()); return LP; } {RP} { yylval = newNode(Rp, yylineno, 0, NULL, nullValue()); return RP; } {LB} { yylval = newNode(Lb, yylineno, 0, NULL, nullValue()); return LB; } {RB} { yylval = newNode(Rb, yylineno, 0, NULL, nullValue()); return RB; } {LC} { yylval = newNode(Lc, yylineno, 0, NULL, nullValue()); return LC; } {RC} { yylval = newNode(Rc, yylineno, 0, NULL, nullValue()); return RC; } {STRUCT} { yylval = newNode(Struct, yylineno, 0, NULL, nullValue()); return STRUCT; } {RETURN} { yylval = newNode(Return, yylineno, 0, NULL, nullValue()); return RETURN; } {IF} { yylval = newNode(If, yylineno, 0, NULL, nullValue()); return IF; } {ELSE} { yylval = newNode(Else, yylineno, 0, NULL, nullValue()); return ELSE; } {WHILE} { yylval = newNode(While, yylineno, 0, NULL, nullValue()); return WHILE; } {TYPE_INT} { yylval = newNode(Type_int, yylineno, 0, NULL, nullValue()); return TYPE_INT; } {TYPE_FLOAT} { yylval = newNode(Type_float, yylineno, 0, NULL, nullValue()); return TYPE_FLOAT; } {DEC_INTEGER} { ValueUnion value = { .integer = strtol(yytext, NULL, 10) }; yylval = newNode(Integer, yylineno, 0, NULL, value); return INTEGER; } {HEX_INTEGER} { ValueUnion value = { .integer = strtol(yytext, NULL, 16) }; yylval = newNode(Integer, yylineno, 0, NULL, value); return INTEGER; } {OCT_INTEGER} { ValueUnion value = { .integer = strtol(yytext, NULL, 8) }; yylval = newNode(Integer, yylineno, 0, NULL, value); return INTEGER; } {FLOAT} { ValueUnion value = { .real = atof(yytext) }; yylval = newNode(Float, yylineno, 0, NULL, value); return FLOAT; } {ID} { char* id = (char*)calloc(sizeof(char), yyleng + 1); strcpy(id, yytext); ValueUnion value = { .id = id }; yylval = newNode(Ident, yylineno, 0, NULL, value); return ID; } {LINE_COMMENT} { yylval = newNode(Line_comment, yylineno, 0, NULL, nullValue()); return LINE_COMMENT; } {BLOCK_COMMENT} { yylval = newNode(Block_comment, yylineno, 0, NULL, nullValue()); return BLOCK_COMMENT; } {NEWLINE}|{WHITE_SPACE} {} . { errors += 1; fprintf(stderr, "Error type A at Line %d: Mysterious character \"%s\".\n", yylineno, yytext); } %%