%{ #include #include %} %start Program %token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS %token IDENT NUM %% Program: Methoddef ';' Program | Structdef ';' Program | ; Structdef: STRUCT Idents END ; Methoddef: METHOD IDENT '(' Idents ')' Statseq END ; Idents: IDENT Idents | ; Statseq: Statement ';' Statseq | ; Statement: Lexpr ':=' Expr | VAR IDENT ':=' Expr | Expr | IF Expr THEN Statseq END | IF Expr THEN Statseq ELSE Statseq END | WHILE Expr DO Statseq END | RETURN Expr ; Lexpr: IDENT | Term '.' IDENT ; Expr: Term | NOT Term | Term Minusterm | Term Multerm | Term Orterm | Term '<' Term | Term '=' Term ; Minusterm: '-' Term Minusterm | '-' Term ; Multerm: '*' Term Multerm | '*' Term ; Orterm: OR Term Orterm | OR Term ; Term: '(' Expr ')' | NUM | '-' NUM | THIS | IDENT | Term '.' IDENT | IDENT '(' Exprs ')' | Term '.' IDENT '(' Exprs ')' ; Exprs: Expr ',' Exprs | Expr | ; %% extern int yylex(); extern int yylineno; int yyerror(char *error_text) { fprintf(stderr,"Zeile %i: %s\n", yylineno, error_text); exit(2); } int main(int argc, char **argv) { #if 0 yydebug=1; #endif yyparse(); return 0; }