# auto-generate bump-allocated AST with refs instead of smart pointers auto-bump lifetime 'lt nonterminals E ES nonterminals A1 B1 C1 A2 terminals + - * / ( ) = ; terminals let in valueterminal int ~ i64 ~ Num(n) ~ n valueterminal var ~ &'lt str ~ Alphanum(x) ~ x topsym ES resync ; left * 500 left / 500 left + 400 left - 400 nonassoc = 300 lexattribute set_line_comment("#") E:Val --> int E:Var --> var E:Plus --> E + E E:Minus --> E - E E:Times --> E * E E:Div --> E:[e1] / E:[e2] E(600):Neg --> - E:[e] E:Let --> let var = E in E E --> ( E ) ES --> E<;+> ;? A1 --> B1 int B1 --> var var A1 flatten B1 flatten A2 C1 --> A2 A1 B1 ; E A2 --> var int $static A1DEFAULT:A1<'static> = A1("","",&A1DEFAULT,0); $static B1DEFAULT:B1<'static> = B1("","",&A1DEFAULT); $impl<'t> Default for &'t A1<'t> { fn default() -> Self { &A1DEFAULT } } $impl<'t> Default for &'t B1<'t> { fn default() -> Self { &B1DEFAULT } } EOF ES ==> E:n ; { let bump = &parser.exstate; let mut v1 = Vec::new(); /* not bump-allocated */ v1.push(bump.make(parser.lc(0,n))); Seq(v1) } <== ES ==> ES:@Seq(mut v)@ E:e ; { v.push(parser.exstate.make(parser.lc(1,e))); Seq(v) } <==