%}
%start Input
-%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS
-%token IDENT NUM ASSIGN
+%token STRUCT END METHOD VAR IF THEN ELSE WHILE DO RETURN NOT OR THIS IDENT NUM ASSIGN
@macro xxputsin(xx,)
@i xx = @Statement.sin@;
@end
@autoinh s
-/* f .. fields
- * s .. symbols */
@attributes { char *name; } IDENT
-@attributes { struct symbol *f; struct symbol *s; } Program
-@attributes { struct symbol *f; } Idents Structdef Parms
-@attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm
-Term Exprs Feld
+@attributes { struct symbol *f; } FeldID Parms Structdef Program
+@attributes { struct symbol *s; } Methoddef Statseq Lexpr Expr Minusterm Multerm Orterm Term Exprs Feld
@attributes { struct symbol *sin; struct symbol *sout; } Statement
@traversal @postorder c
Input:
Program
@{
- @i @Program.s@ = @Program.f@;
+ @i @Program.f@ = tab_new();
@}
;
Program:
Methoddef ';' Program
@{
- @i @Program.0.f@ = @Program.1.f@;
+ @i @Methoddef.s@ = @Program.0.f@;
+ @i @Program.1.f@ = @Program.0.f@;
@}
-
+
| Structdef ';' Program
@{
- @i @Program.0.f@ = tab_merge(@Structdef.f@, @Program.1.f@, 1);
+ @i @Program.1.f@ = tab_merge(@Program.0.f@, @Structdef.f@, 1);
@}
-
|
- @{
- @i @Program.0.f@ = new_tab();
- @}
;
Methoddef:
;
Structdef:
- STRUCT Idents END
+ STRUCT FeldID END
@{
- @i @Structdef.f@ = @Idents.f@;
+ @i @Structdef.f@ = @FeldID.f@;
@}
;
|
@{
- @i @Parms.f@ = new_tab();
+ @i @Parms.f@ = tab_new();
@}
;
-Idents:
- IDENT Idents
+FeldID:
+ IDENT FeldID
@{
- @i @Idents.0.f@ = tab_add_symbol(@Idents.1.f@, @IDENT.name@, S_FIELD, 1);
+ @i @FeldID.0.f@ = tab_add_symbol(@FeldID.1.f@, @IDENT.name@, S_FIELD, 1);
@}
|
@{
- @i @Idents.f@ = new_tab();
+ @i @FeldID.f@ = tab_new();
@}
;
| VAR IDENT ASSIGN Expr
@{
- @i @Statement.sout@ = tab_add_symbol(clone_tab(@Statement.sin@), @IDENT.name@, S_VAR, 1);
+ /* tab_clone ist hier noetig, vgl. folgendes statement
+ * > var x := x - 1; */
+ @i @Statement.sout@ = tab_add_symbol(tab_clone(@Statement.sin@), @IDENT.name@, S_VAR, 1);
xxputsin(@Expr.s@,)
@}
Lexpr:
IDENT
@{
- @c check_variable(@Lexpr.s@, @IDENT.name@);
+ @c check(@Lexpr.s@, @IDENT.name@, S_VAR);
@}
| Feld
Feld: Term '.' IDENT
@{
- @c check_field(@Feld.s@, @IDENT.name@);
+ @c check(@Feld.s@, @IDENT.name@, S_FIELD);
@}
;
| THIS
| IDENT
@{
- @c check_variable(@Term.s@, @IDENT.name@);
+ @c check(@Term.s@, @IDENT.name@, S_VAR);
@}
| Feld
| IDENT '(' Exprs ')'
- @{
- @c check_variable(@Term.s@, @IDENT.name@);
- @}
-
| Term '.' IDENT '(' Exprs ')'
- @{
- @c check_variable(@Term.s@, @IDENT.name@);
- @}
;
Exprs: