1
0
mirror of https://github.com/fluencelabs/lalrpop synced 2025-03-31 07:21:04 +00:00
lalrpop/doc/calculator/src/calculator6.lalrpop
2016-11-22 23:03:56 +01:00

48 lines
912 B
Plaintext

use std::str::FromStr;
use ast::{Expr, Opcode};
use lalrpop_util::ErrorRecovery;
grammar<'err>(errors: &'err mut Vec<ErrorRecovery<usize, (usize, &'input str), ()>>);
pub Exprs = Comma<Expr>;
Comma<T>: Vec<T> = { // (0)
<v:(<T> ",")*> <e:T?> => match e { // (1)
None=> v,
Some(e) => {
let mut v = v;
v.push(e);
v
}
}
};
Tier<Op,NextTier>: Box<Expr> = {
Tier<Op,NextTier> Op NextTier => Box::new(Expr::Op(<>)),
NextTier
};
Expr = Tier<ExprOp, Factor>;
Factor = Tier<FactorOp, Term>;
ExprOp: Opcode = { // (3)
"+" => Opcode::Add,
"-" => Opcode::Sub,
};
FactorOp: Opcode = {
"*" => Opcode::Mul,
"/" => Opcode::Div,
};
Term: Box<Expr> = {
Num => Box::new(Expr::Number(<>)),
"(" <Expr> ")",
! => { errors.push(<>); Box::new(Expr::Error) },
};
Num: i32 = {
r"[0-9]+" => i32::from_str(<>).unwrap()
};