rustlr 0.1.0

LR(1)/LALR(1) parser generator for rust
Documentation
# LR grammar (ambiguous) for Mongoose 0.2
# note that : and || cannot be used for terminal names as they class with
# the expected syntax of the grammar: the lexer must translate appropriately

use crate::abstract_syntax::*;
use crate::abstract_syntax::Expr::*;

absyntype Expr
nonterminal E Expr
nonterminal ES Expr
terminal + - * / % ^ ( ) COLON = < <= == . ; && OROR ! 
terminal if else while let cin cout lambda
typedterminal Var mut String
typedterminal Val i32
typedterminal Str String
topsym E

# only proper operators should need precedence declarations

left + 200
left - 300
left * 400
left / 500
left % 500
left ^ 550
left = 30
left == 35
left <= 35
left < 35
left && 190
left || 192
left ! 194

E --> Val:n { n }
E --> ( E:e )  { e }
E --> ( Var:f E:x ) { App(getstr(f),rx(x)) }
E --> cin { Uniop(2,rx(Nothing)) }
E --> cout Str:s { Uniop(3,rx(s)) } 
E --> cout E:e { Uniop(3,rx(e)) }
E --> E:a + E:b { Binop(0,rx(a),rx(b)) }
E --> E:a - E:b { Binop(1,rx(a),rx(b)) }
E --> E:a * E:b { Binop(2,rx(a),rx(b)) }
E --> E:a / E:b { Binop(3,rx(a),rx(b)) }
E --> E:a % E:b { Binop(4,rx(a),rx(b)) }
E --> E:a ^ E:b { Binop(5,rx(a),rx(b)) }
#E --> E:a = E:b { Binop(6,rx(a),rx(b)) }
E --> E:a == E:b { Binop(7,rx(a),rx(b)) }
E --> E:a < E:b { Binop(8,rx(a),rx(b)) }
E --> E:a <= E:b { Binop(9,rx(a),rx(b)) }
E --> while ( E:a ) E:b { Binop(10,rx(a),rx(b)) }
E --> E:a && E:b { Binop(11,rx(a),rx(b)) }
E --> E:a OROR E:b { Binop(12,rx(a),rx(b)) }
E --> - E:e { Uniop(0,rx(e)) }
E --> ! E:e { Uniop(1,rx(e)) }
E --> let Var:x = E:e1 COLON E:e2 { Letexp(getstr(x),rx(e1),rx(e2)) }
E --> Var:x = E:e { Assign(getstr(x),rx(e)) }
E --> lambda Var:x . E:e { Lambda(getstr(x),rx(e)) }
E --> if E:c E:a  else E:b { Ifelse(rx(c),rx(a),rx(b)) }
E --> E:e ; ES:es { Seq(rx(e),rx(es)) }
ES -->  { Nothing }
ES --> E:e ; ES:es { Seq(rx(e),rx(es)) }
E --> Var:x { Var(getstr(x)) }

EOF