Omawiamy przykład priorytetów, n.p.
%token NUM %left '-' '+' %left '*' '/' %left NEG /* leksem-widmo: minus unarny */ %right '^' /* potęgowanie */ %% exp: NUM { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = pow ($1,$3);} | '(' exp ')' { $$ = $2; } ; %%
Omawiamy przykład obsługi błędów, n.p.
exp: NUM { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = pow ($1,$3);} | '(' exp ')' { $$ = $2; } | '(' error ')' { printf("Error in expression\n");$$ = 0;} ;
Studenci powinni zaimplementować powyzsze przykłady w swoich programach, poza tym piszą parser dla Javalette.
Priorytety:
precedence left PLUS, MINUS; precedence left TIMES, DIVIDE, MOD; precedence left UMINUS; expr ::= MINUS expr:e {: RESULT = new Integer(0 - e.intValue()); :} %prec UMINUS
Obsługa błędów:
stmt ::= expr SEMI | while_stmt SEMI | if_stmt SEMI | ... | error SEMI ;
Tak samo jak Bison, np.
%left '+' '-' %left '*' '/' %left NEG %% Exp : | Exp '+' Exp { Plus $1 $3 } | Exp '-' Exp { Minus $1 $3 } | Exp '*' Exp { Times $1 $3 } | Exp '/' Exp { Div $1 $3 } | '(' Exp ')' { Brack $2 } | '-' Exp %prec NEG { Negate $2 } | int { Int $1 }
Omawiamy przykład, np.
entrypoints Exp; EAdd. Exp ::= Exp "+" Exp1 ; EMul. Exp1 ::= Exp1 "*" Exp2 ; ENum. Exp2 ::= Integer ; coercions Exp 2;
Studenci powinni