diff options
author | Greg Brown <gmb60@cam.ac.uk> | 2021-04-20 13:22:49 +0100 |
---|---|---|
committer | Greg Brown <gmb60@cam.ac.uk> | 2021-04-20 13:22:49 +0100 |
commit | bb3c8d1455f7a102a0c0abffd757ccace94f77d5 (patch) | |
tree | 5c2793598c781c648c4d9cd103414ff47d88adc1 /chomp-bench/src/arith/lalr.lalrpop | |
parent | 15f5491028b11bd821bd141183e8b5bf8c1c46af (diff) |
Add LALRPOP arithmetic parser.
Diffstat (limited to 'chomp-bench/src/arith/lalr.lalrpop')
-rw-r--r-- | chomp-bench/src/arith/lalr.lalrpop | 33 |
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(); |