Calculadora (lex/yacc)
Código Yacc
/* Gramatica: {Vt, Vn, P, S}
* Vt = {INTEGER, NEWLINE, +, -, *, /, (, )}
* Vn = {line, term, expr}
* P = {
* line -> epsilon
* line -> term
* term -> newline
* term -> expr newline
* expr -> intnumer
* expr -> expr + expr
* expr -> expr - expr
* expr -> expr * expr
* expr -> expr / expr
* expr -> (expr)
* expr -> -expr
* }
* S = line
*/
%{
#include <stdio.h>
int intval;
extern char *yytext;
%}
%token INTEGER, NEWLINE
%left '+' '-'
%left '*' '/'
%nonassoc UMINUS
%start line /* simbolo sentencial */
%%
line:
| line term
;
term: NEWLINE
| expr NEWLINE {printf("%d\n", $1);}
| error NEWLINE {yyerror;}
;
expr: INTEGER {$$ = intval;}
| expr '+' expr {$$ = $1 + $3;}
| expr '-' expr {$$ = $1 - $3;}
| expr '*' expr {$$ = $1 * $3;}
| expr '/' expr {if($3) $$ = $1 / $3;
else {
printf("Divide by zero");
yyerror;
}
}
| '(' expr ')' {$$ = $2;}
| '-' expr %prec UMINUS {$$ = - $2;}
;
%%
main()
{
yyparse();
}
yyerror(s)
char *s;
{
printf("Oops: %s at symbol %c\n", s, yytext[0]);
}
Código Lex
%{
#include "y.tab.h"
extern int intval;
%}
integer [0-9]+
nl \n
%%
[ \t]+ ;
{integer} {sscanf(yytext, "%d", &intval); return INTEGER;}
{nl} {return NEWLINE;}
. {return yytext[0];}
%%
Ivan Luiz Marques Ricarte
Last modified: Wed Sep 26 20:00:18 EST 2001