/* calc.y * YACC desk calculator example, adopted from ALSU, sec. 4.9 * handles arithmetic on single digits * * to compile, use: yacc calc.y gcc -o calc y.tab.c -ly */ %{ #include %} %token DIGIT %% lines : lines expr '\n' { printf("= %d\n", $2); } | lines '\n' | /* epsilon */ ; expr : expr '+' term { $$ = $1 + $3; } | expr '-' term { $$ = $1 - $3; } | term { $$ = $1; /* default rule */ } ; term : term '*' factor { $$ = $1 * $3; } | term '/' factor { $$ = $1 / $3; } | factor ; factor : '(' expr ')' { $$ = $2; } | DIGIT ; %% int yylex() { int c = getchar(); if (c >= '0' && c <= '9') { yylval = c - '0'; return DIGIT; } return c; }