Example
%{ /* Aho, Lam, Sethi, Ullman, Compilers: Fig. 4.59 */ #include <ctype.h> #include <stdio.h> #define YYSTYPE double /* double type for yacc stack */ %} %token NUMBER %left '+' '-' %left '*' '/' %right UMINUS %% lines: lines expr '\n' { printf("%f\n",$2); } | lines '\n' | /* epsilon */ | error '\n' {yyerror("reenter last line:"); yyerrok; } ; expr: expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } | '-' expr %prec UMINUS { $$ = - $2; } | NUMBER ; %% yylex() { int c; while ( (c = getchar()) == ' '); if ( (c == '.') || (isdigit(c)) ) { ungetc(c, stdin); scanf("%lf", &yylval); return NUMBER; } return c; } yyerror(s) char * s; { fputs(s,stderr), putc('\n',stderr); } main() /* Call repeatedly to test */ { int res; while (1) { res = yyparse(); } }