#include <stdio.h>
#include <stdlib.h>
#include <string.h>
- #include "symbol_table.h"
+ #include "symtable.h"
%}
%start Input
@autoinh symbols
@attributes { char *name; } ID
-@attributes { struct symbol_t *fields; struct symbol_t *symbols; } Program
-@attributes { struct symbol_t *fields; } Ids Structdef
-@attributes { struct symbol_t *pars; } Pars
-@attributes { struct symbol_t *symbols; } Funcdef Stats Bool Expr Call Lexpr Field Term Plusterm Malterm Bterm Orterm Exprs
-@attributes { struct symbol_t *in_symbols; struct symbol_t *out_symbols; } Stat
+@attributes { struct symbol *fields; struct symbol *symbols; } Program
+@attributes { struct symbol *fields; } Ids Structdef
+@attributes { struct symbol *pars; } Pars
+@attributes { struct symbol *symbols; } Funcdef Stats Bool Expr Call Lexpr Field Term Plusterm Malterm Bterm Orterm Exprs
+@attributes { struct symbol *in_symbols; struct symbol *out_symbols; } Stat
-@traversal @postorder t
+@traversal @postorder c
%%
Program: Funcdef ';' Program
@{
- @i @Program.fields@ = @Program.1.fields@;
+ @i @Program.0.fields@ = @Program.1.fields@;
@}
| Structdef ';' Program
@{
- @i @Program.fields@ = table_merge(@Structdef.fields@, @Program.1.fields@, 1);
- @i @Program.1.symbols@ = @Program.0.symbols@;
+ @i @Program.0.fields@ = tab_merge(@Structdef.fields@, @Program.1.fields@, 1);
@}
|
- @{ @i @Program.fields@ = new_table(); @}
+ @{ @i @Program.fields@ = new_tab(); @}
;
Funcdef: FUNC ID '(' Pars ')' Stats END
- @{ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, @Pars.pars@, 0); @}
-
- |
- FUNC ID '(' ')' Stats END
- @{ @i @Stats.symbols@ = table_merge(@Funcdef.symbols@, new_table(), 0); @}
+ @{ @i @Stats.symbols@ = tab_merge(@Funcdef.symbols@, @Pars.pars@, 0); @}
;
;
Ids: ID Ids
- @{ @i @Ids.fields@ = table_add_symbol(@Ids.1.fields@, @ID.name@, SYMBOL_TYPE_FIELD, 1); @}
+ @{ @i @Ids.0.fields@ = tab_add_symbol(@Ids.1.fields@, @ID.name@, S_FIELD, 1); @}
|
- @{ @i @Ids.fields@ = new_table(); @}
+ @{ @i @Ids.fields@ = new_tab(); @}
;
Pars: Pars ',' ID
- @{ @i @Pars.pars@ = table_add_symbol(@Pars.1.pars@, @ID.name@, SYMBOL_TYPE_VAR, 0); @}
+ @{ @i @Pars.0.pars@ = tab_add_symbol(@Pars.1.pars@, @ID.name@, S_VAR, 0); @}
| ID
- @{ @i @Pars.pars@ = table_add_symbol(new_table(), @ID.name@, SYMBOL_TYPE_VAR, 0); @}
+ @{ @i @Pars.pars@ = tab_add_symbol(new_tab(), @ID.name@, S_VAR, 0); @}
+
+ |
+ @{ @i @Pars.pars@ = new_tab(); @}
;
Stats: Stat ';' Stats
@{
- @i @Stat.in_symbols@ = @Stats.symbols@;
+ @i @Stat.in_symbols@ = @Stats.0.symbols@;
@i @Stats.1.symbols@ = @Stat.out_symbols@;
@}
Stat: VAR ID ASSIGN Expr
@{
- @i @Stat.out_symbols@ = table_add_symbol(clone_table(@Stat.in_symbols@), @ID.name@, SYMBOL_TYPE_VAR, 0);
+ @i @Stat.out_symbols@ = tab_add_symbol(clone_tab(@Stat.in_symbols@), @ID.name@, S_VAR, 0);
@i @Expr.symbols@ = @Stat.in_symbols@;
@}
| IF Bool THEN Stats ELSE Stats END
@{
@i @Bool.symbols@ = @Stat.in_symbols@;
- @i @Stats.symbols@ = @Stat.in_symbols@;
+ @i @Stats.0.symbols@ = @Stat.in_symbols@;
@i @Stats.1.symbols@ = @Stat.in_symbols@;
@i @Stat.out_symbols@ = @Stat.in_symbols@;
@}
;
Lexpr: ID
- @{ @t check_variable(@Lexpr.symbols@, @ID.name@); @}
+ @{ @c check_variable(@Lexpr.symbols@, @ID.name@); @}
| Field
;
Term: '(' Expr ')'
| ID
- @{ @t check_variable(@Term.symbols@, @ID.name@); @}
+ @{ @c check_variable(@Term.symbols@, @ID.name@); @}
| NUM
| Call
;
Field: Term '.' ID
- @{ @t check_field(@Field.symbols@, @ID.name@); @}
+ @{ @c check_field(@Field.symbols@, @ID.name@); @}
;