summaryrefslogtreecommitdiff
path: root/chomp-bench/src/arith/lalr.lalrpop
diff options
context:
space:
mode:
Diffstat (limited to 'chomp-bench/src/arith/lalr.lalrpop')
-rw-r--r--chomp-bench/src/arith/lalr.lalrpop33
1 files changed, 33 insertions, 0 deletions
diff --git a/chomp-bench/src/arith/lalr.lalrpop b/chomp-bench/src/arith/lalr.lalrpop
new file mode 100644
index 0000000..fe21d01
--- /dev/null
+++ b/chomp-bench/src/arith/lalr.lalrpop
@@ -0,0 +1,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();