( ) op num id if else = SEMICOLON var return
function { }
unreachable
%%

Exp   : ( Exp )
      | Exp op Exp
      | num
      | id
      | id ( Exp )
      ;

Stm   : if ( Exp ) Stm
      | if ( Exp ) Stm else Stm
      | { Stms }
      | id = Exp SEMICOLON
      | var id SEMICOLON
      | return Exp SEMICOLON
      ;

Stms  : Stm
      | Stm Stms
      ;

Func  : function id ( id ) { Stms }
      ;

Funcs : Func
      | Func Funcs
      ;

Prog  : Funcs
      | Foo if else
      ;


      

Foo : Foo if else
    | Foo Bar
    ;

Bar : Bar
    | Bar Foo unreachable
    ;

UnreachableNonterminal : unreachable
                       | UnreachableNonterminal unreachable
                       ;
%%

Prog
