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