%{ #include #include #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; } %} %token NUM %left '+' '-' '*' '/' %% line_list : line | line_list line ; line : '\n' | exp '\n' {printf("> %d\n", $1);} | error '\n' {yyclearin; yyerrok;} ; exp : NUM | exp '+' exp {$$ = $1 + $3;} | exp '-' exp {$$ = $1 - $3;} | exp '*' exp {$$ = $1 * $3;} | exp '/' exp {$$ = $1 / $3;} | '(' exp ')' {$$ = $2;} ; %% int main(int argc, char **argv){ lexer = new yyFlexLexer; return yyparse(); }