%{ #include #include #include "expr.hpp" #define YYDEBUG 1 FlexLexer* lexer = NULL; inline int yylex() { return lexer->yylex(); } int yyerror(const char *s){ extern int yychar; printf("yyerror:%s token:%d yytext:%s\n", s, yychar, lexer->YYText()); return -1; } %} %union { Expr* expr; } %token INTE %left '+' '-' '*' '/' '%' %type expr %% line_list : line | line_list line ; line : '\n' | expr '\n' {$1->to_bytecode();} | error '\n' {yyclearin; yyerrok;} ; expr : INTE | expr '+' expr { Oper* oper = new Oper(ADD); oper->left = $1; oper->right = $3; $$ = oper; } | expr '-' expr { Oper* oper = new Oper(SUB); oper->left = $1; oper->right = $3; $$ = oper; } | expr '*' expr { Oper* oper = new Oper(MUL); oper->left = $1; oper->right = $3; $$ = oper; } | expr '/' expr { Oper* oper = new Oper(DIV); oper->left = $1; oper->right = $3; $$ = oper; } | expr '%' expr { Oper* oper = new Oper(MOD); oper->left = $1; oper->right = $3; $$ = oper; } | '(' expr ')' {$$ = $2;} ; %% int main(int argc, char **argv){ lexer = new yyFlexLexer; return yyparse(); }