/* $Id$ */ e.program ::= t.func_def e.func_defs e.func_defs ::= /*empty*/ | t.func_def e.func_defs t.func_def ::= (FUNC t.name (e.func_type) (e.var_decls) t.sentence e.sentences) e.func_type ::= t.type e.types t.type e.types ::= /*empty*/ | t.type e.types e.var_decls ::= /*empty*/ | (t.var e.vars t.type) e.var_decls e.vars ::= /*empty*/ | t.var e.vars e.sentences ::= /*empty*/ | t.sentence e.sentences t.sentence ::= (SENTENCE t.name ((t.pat e.pattern) e.patterns) t.term e.exp) e.patterns ::= /*empty*/ | (t.pat e.pattern) e.patterns e.pattern ::= /*empty*/ | t.pat e.pattern t.pat ::= t.var | t.const e.exp ::= /*empty*/ | t.term e.exp t.term ::= (UNDEFINED) | t.const | t.var | (CALL t.name (e.exp) e.args) | (PAREN e.exp) | (IF (e.exp) (e.exp) (e.exp)) | (LET (t.assign e.assigns) e.exp) e.args ::= /*empty*/ | (e.exp) e.args e.assigns ::= /*empty*/ | t.assign e.assigns t.assign ::= (t.var e.exp) t.const ::= [a character] t.type ::= (TYPE t.name) t.var ::= (VAR t.name) t.name ::= "compound_symbol"