![]() | ![]() | ![]() | Sintaxe Abstracta |
{int a; a=T(); eat(TIMES); return a*F();}
int F_follow[] = {PLUS,TIMES,RPAREN,EOF,-1};
int F(void) { switch (tok) {
case ID: {int i=lookup(tokval.id);
advance(); return i;}
case NUM:{int i=tokval.num;
advance(); return i;}
case LPAREN: eat(LPAREN); {int i=E();
eatOrSkipTo(RPAREN, F_follow);
return i;}
default: printf("expected ID, NUM, (");
skipto(F_FOLLOW); return(0);
}}
int T_follow[] = {PLUS,RPAREN,EOF,-1};
int T(void) { switch (tok) {
case ID: case NUM: case LPAREN:
return Tprime(F());
default: ....
}}
int Tprime(int a) {switch(tok) {
case TIMES: eat(TIMES);return Tprime(a*F());
case PLUS: case RPAREN; case EOF: return a;
default: ....
}}
%{ yylex e yyerror }%
%union {int num; string id;}
%token <num> INT
%token <id> ID
%type <num> exp
%start exp
%left PLUS MINUS
%left TIMES
%left UMINUS
%%
exp : INT {$$ = $1;}
| exp PLUS exp {$$ = $1+$3;}
| exp MINUS exp {$$ = $1-$3;}
| exp TIMES exp {$$ = $1*$3;}
| MINUS exp % prec UMINUS {$$ = -$2;}
prog: stm {$$=$1}
stm : stm SEMICOLON stm
{$$=A_CompoundStm($1,$3);}
stm : ID ASSIGN exp
{$$=A_AssignStm($1,$3);}
stm : PRINT LPAREN exps RPAREN
{$$=A_PrintStm($3);}
exps: exp {$$=A_ExpList($1,NULL);}
exps: exp COMMA exps
{$$=A_ExpList($1,$3);}
exp: INT {$$=A_NumExp($1);}
exp: ID {$$=A_IdExp($1);}
exp: exp PLUS exp {$$=A_OpExp($1,A_plus,$3);}
exp: exp MINUS exp
{$$=A_OpExp($1,A_minus,$3);}
exp: exp TIMES exp
{$$=A_OpExp($1,A_times,$3);}
exp: exp DIV exp {$$=A_OpExp($1,A_div,$3);}
exp: stm COMMA exp
{$$=A_EseqExp($1,$3);}
exp: LPAREN exp RPAREN
{$$=$1;}
exp : expl PLUS pos exp
{$$=A_OpExp($1,A_plus,$4,$3);}
e
exp : pos expl PLUS exp
{$$=A_OpExp($2,A_plus,$4,$1);}
![]() | ![]() | ![]() | Sintaxe Abstracta |