mirror of
https://github.com/fluencelabs/lalrpop
synced 2025-03-31 07:21:04 +00:00
48 lines
912 B
Plaintext
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()
|
|
};
|
|
|