Laboratorium 6: generatory parserów: priorytety i obsługa błędów

Bison

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.

Java Cup

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
	     ;

Happy

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 }

BNFC

Omawiamy przykład, np.

entrypoints Exp;
 
EAdd.  Exp  ::= Exp "+" Exp1 ;
EMul.  Exp1 ::= Exp1 "*" Exp2 ;
ENum.  Exp2 ::= Integer ;
coercions Exp 2;

Studenci powinni

  • skompilować i uruchomić ten przykład w swoim języku programowania
  • przeanalizować kod wygenerowany przez BNFC
  • rozszerzyć powyższy przykład o operatorym nawiasy, etc.
  • ręcznie zmodyfikować wygenerowany przez BNFC parser