/* Infix notation calculator-calc */ %{ #define YYDEBUG 1 /* #define DEBUG_DEBUG */ #include #include #include int yyerror(void*, char*); #define yylex ((UBison*)obj)->UFlexer::yylex %} /* BISON Declarations */ %lex-param { void* obj } %parse-param { void* obj } %union { int number; UFlexerReference ref; } %token NUM %left '-' '+' %left '*' '/' %left NEG /* negation--unary minus */ %right '^' /* exponentiation */ %type exp /* Grammar follows */ %% input: /* empty string */ | input line ; line: '\n' | exp '\n' { printf("\t%d\n", $1); U_INTERNAL_TRACE("UBison::yyparse() %d", $1); } ; exp: NUM { $$ = $1; U_INTERNAL_TRACE("UBison::yyparse() %d", $1); } | exp '+' exp { $$ = $1 + $3; U_INTERNAL_TRACE("UBison::yyparse() %d + %d", $1, $3); } | exp '-' exp { $$ = $1 - $3; U_INTERNAL_TRACE("UBison::yyparse() %d - %d", $1, $3); } | exp '*' exp { $$ = $1 * $3; U_INTERNAL_TRACE("UBison::yyparse() %d * %d", $1, $3); } | exp '/' exp { $$ = $1 / $3; U_INTERNAL_TRACE("UBison::yyparse() %d / %d", $1, $3); } | '-' exp %prec NEG { $$ = -$2; U_INTERNAL_TRACE("UBison::yyparse() %d", $2); } | exp '^' exp { $$ = (int) ::pow((float)$1, (float)$3); U_INTERNAL_TRACE("UBison::yyparse() %d ^ %d", $1, $3); } | '(' exp ')' { $$ = $2; U_INTERNAL_TRACE("UBison::yyparse() %d", $2); } ; %% int yyerror(void* p, char* s) { U_INTERNAL_TRACE("yyerror(\"%p,%s\")", p, s); /** * extern int yylineno; * * U_INTERNAL_TRACE("yylineno=%d", yylineno) */ return -1; } #include int main(int argc, char* argv[]) { U_ULIB_INIT(argv); U_TRACE(5, "main(%d)", argc) UBison parser(UFile::contentOf(argv[1])); /* */ extern int yydebug; yydebug = 1; parser.parse(); }