# types Expr, Calcscanner defined in exprtrees.rs !use bumpalo::Bump; !use crate::bxprtrees::*; /* ! lines are injected verbatim into parser */ !use crate::bxprtrees::Expr::*; !use rustlr::{LC,Bumper}; lifetime 'lt absyntype Expr<'lt> externtype Bumper<'lt,()> nonterminals E ES terminals + - * / ( ) = ; terminals let in typedterminal int i64 typedterminal var &'lt str topsym ES resync ; left * 500 left / 500 left + 400 left - 400 nonassoc = 300 lexvalue int Num(n) n lexvalue var Alphanum(x) x lexattribute set_line_comment("#") E --> int:m { Val(m) } E --> var:s { Var(s) } E --> E:e1 + E:e2 { Plus(e1.make(parser.exstate.get()),e2.make(parser.exstate.get())) } E --> E:e1 - E:e2 { Minus(e1.make(parser.exstate.get()),e2.make(parser.exstate.get())) } E --> E:e1 * E:e2 { Times(e1.make(parser.exstate.get()),e2.make(parser.exstate.get())) } #E --> E:e1 / E:e2 { Divide(e1.make(parser.exstate.get()),e2.make(parser.exstate.get())) } E --> E:e1 / E:e2 { Divide(e1.make(parser.exstate.get()),parser.exstate.make(parser.lc(2,e2))) } E(600) --> - E:e { Negative(parser.exstate.make(parser.lc(1,e))) } E --> let var:x = E:e in E:b {Letexp(x,e.make(parser.exstate.get()),b.make(parser.exstate.get()))} E --> ( E:e ) { e } 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) } <== EOF