blob: fe21d012d0ec32e529473b4c2604b7d3706c7899 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
use std::str::FromStr;
grammar;
pub Expression: i64 = {
<p : Product> <v : (<AddOp> <Product>)*> => {
v.into_iter().fold(p, |acc, (op, p)| if op { acc + p } else { acc - p })
}
}
AddOp: bool = {
"+" => true,
"-" => false,
}
Product: i64 = {
<t : Term> <v : (<MulOp> <Term>)*> => {
v.into_iter().fold(t, |acc, (op, t)| if op { acc * t } else { acc / t })
}
}
MulOp: bool = {
"*" => true,
"/" => false,
}
Term: i64 = {
Number,
"-" <Number> => -<>,
"(" <Expression> ")",
}
Number: i64 = r"[0-9]+" => i64::from_str(<>).unwrap();
|