# Grammar for parsing lambdascript, with integer constants. This grammar, # when used with my LR(1) parser generater produced 70 states. It creates # 3 files: lambdaplusparser.java, lambdaplus.flex and Mylambdapluslexer.java. # The lambdaplus.flex file will create a lexical analyzer based on the the # terminal symbols of the grammar, and Mylambdapluslexer is an object adapter # that allows the lexical analyzer to be used in the parser. See the # file kam.java for usage. # This block contains code that will be added to the parser class verbatim: {% kam machine; public void setup(kam m) {machine=m;} /* kam.java extras */ %} terminal lambda ( ) [ ] DOT let = in define ; typedterminal INTEGER Integer typedterminal ID String nonterminal T term nonterminal Vars ArrayList nonterminal Moreargs ArrayList nonterminal Ts ArrayList topsym Ts # automatically enables genflex option: flexname DOT . Ts --> T:x ; { ArrayList S = new ArrayList(); S.add(x); return S; } Ts --> Ts:y T:x ; { y.add(x); return y; } T --> ID:x { return new var(x); } T --> INTEGER:x { return new iconst(x); } T --> ( T:a Moreargs:ts ) {: if (ts.size()<1) return a; term t = new app(a,ts.get(0)); for(int i=1;i lambda Vars:vs DOT T:b {: term t = b; for(int i=vs.size()-1;i>=0;i--) t = new abs(vs.get(i),t); return t; :} T --> let ID:x = T:v in T:b { return new app(new abs(x,b),v); } # define evaluate to the term being defined, but also affects global env T --> define ID:x = T:v {: machine.Defs = new Binding(new var(x),new Closure(v,machine.Defs),machine.Defs); return v; :} Moreargs --> { ArrayList s = new ArrayList(); return s; } Moreargs --> Moreargs:ts T:b { ts.add(b); return ts; } Vars --> ID:x {: ArrayList A = new ArrayList(); A.add(x); return A; :} Vars --> Vars:vs ID:y {vs.add(y); return vs;} EOF