-Input: Program
- @{ @i @Program.symbols@ = @Program.fields@; @}
-
- ;
-
-Program: Funcdef ';' Program
- @{
- @i @Program.0.fields@ = @Program.1.fields@;
- @}
-
- | Structdef ';' Program
- @{
- @i @Program.0.fields@ = tab_merge(@Structdef.fields@, @Program.1.fields@, 1);
- @}
-
- |
- @{ @i @Program.fields@ = new_tab(); @}
-
- ;
-
-Funcdef: FUNC ID '(' Pars ')' Stats END
- @{ @i @Stats.symbols@ = tab_merge(@Funcdef.symbols@, @Pars.pars@, 0); @}
-
- ;
-
-Structdef: STRUCT Ids END
- @{ @i @Structdef.fields@ = @Ids.fields@; @}
-
- ;
-
-Ids: ID Ids
- @{ @i @Ids.0.fields@ = tab_add_symbol(@Ids.1.fields@, @ID.name@, S_FIELD, 1); @}
-
- |
- @{ @i @Ids.fields@ = new_tab(); @}
-
- ;
-
-Pars: Pars ',' ID
- @{ @i @Pars.0.pars@ = tab_add_symbol(@Pars.1.pars@, @ID.name@, S_VAR, 0); @}
-
- | ID
- @{ @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.0.symbols@;
- @i @Stats.1.symbols@ = @Stat.out_symbols@;
- @}
-
- |
- ;
-
-Stat: VAR ID ASSIGN Expr
- @{
- @i @Stat.out_symbols@ = tab_add_symbol(clone_tab(@Stat.in_symbols@), @ID.name@, S_VAR, 0);
- @i @Expr.symbols@ = @Stat.in_symbols@;
- @}
-
- | Lexpr ASSIGN Expr
- @{
- @i @Stat.out_symbols@ = @Stat.in_symbols@;
- @i @Lexpr.symbols@ = @Stat.in_symbols@;
- @i @Expr.symbols@ = @Stat.in_symbols@;
- @}
-
- | IF Bool THEN Stats END
- @{
- @i @Bool.symbols@ = @Stat.in_symbols@;
- @i @Stats.symbols@ = @Stat.in_symbols@;
- @i @Stat.out_symbols@ = @Stat.in_symbols@;
- @}
-
- | IF Bool THEN Stats ELSE Stats END
- @{
- @i @Bool.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@;
- @}
-
- | WHILE Bool DO Stats END
- @{
- @i @Bool.symbols@ = @Stat.in_symbols@;
- @i @Stats.symbols@ = @Stat.in_symbols@;
- @i @Stat.out_symbols@ = @Stat.in_symbols@;
- @}
-
- | Call
- @{
- @i @Call.symbols@ = @Stat.in_symbols@;
- @i @Stat.out_symbols@ = @Stat.in_symbols@;
- @}
-
- | RETURN Expr
- @{
- @i @Expr.symbols@ = @Stat.in_symbols@;
- @i @Stat.out_symbols@ = @Stat.in_symbols@;
- @}
-
- ;
-
-Lexpr: ID
- @{ @c check_variable(@Lexpr.symbols@, @ID.name@); @}
-
- | Field
- ;
-
-Expr: '-' Term
- | Term
- | Term Plusterm
- | Term Malterm
- ;
-
-Plusterm: '+' Term Plusterm
- | '+' Term
- ;
-
-Malterm: '*' Term Malterm
- | '*' Term
- ;
-
-Term: '(' Expr ')'
- | ID
- @{ @c check_variable(@Term.symbols@, @ID.name@); @}
-
- | NUM
- | Call
- | Field
- ;
-
-Bool: Bterm
- | Bterm Orterm
- | NOT Bterm
- ;
-
-Orterm: OR Bterm Orterm
- | OR Bterm
- ;
-
-Bterm: Term GREATER Term
- | Term '=' Term
- | '(' Bool ')'
- ;
-
-Field: Term '.' ID
- @{ @c check_field(@Field.symbols@, @ID.name@); @}
-
- ;
-
-Call: ID '(' Exprs ')'
- | ID '(' ')'
- ;
-
-Exprs: Expr
- | Exprs ',' Expr
- ;