compounds != == end compounds keys int char for end keys define program [repeat declaration+] end define define declaration [variable] | [func] end define define variable [type] [id] '; | [id] end define define type 'int | 'char end define define func [type] [id] ( [list formalParameter] ) [block] end define define formalParameter [type] [id] end define define block '{ [repeat variable] [repeat stat] '} end define define stat [forStat] | [expr] '; | [block] | [assignStat] '; | '; end define define forStat 'for '( [assignStat] '; [expr] '; [assignStat] ') [block] end define define assignStat [id] '= [expr] end define define expr [condExpr] end define define condExpr [aexpr] [opt condExprAux] end define define condExprAux [eqn] [aexpr] end define define eqn '== | '!= end define define aexpr [mexpr] [repeat aexprAux] end define define aexprAux '+ [mexpr] end define define mexpr [atom] [repeat mexprAux ] end define define mexprAux '* [atom] end define define atom [id] | [number] | '( [expr] ') end define rule main replace [variable] T [type] I [id] '; by I end rule