summaryrefslogtreecommitdiff
path: root/src/taiga.lalrpop
diff options
context:
space:
mode:
authorDavid Li <li.davidm96@gmail.com>2017-11-04 19:33:45 -0400
committerDavid Li <li.davidm96@gmail.com>2017-11-04 19:33:45 -0400
commit9891204b026c7660676f456128c94b01ae7f39cf (patch)
tree7f7aaddcabb8c653145f309aeb77a3a392c576d0 /src/taiga.lalrpop
parent6cbe4d98095020451f5b427fecbc3f374812dec8 (diff)
Parse comparison operators
Diffstat (limited to 'src/taiga.lalrpop')
-rw-r--r--src/taiga.lalrpop30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/taiga.lalrpop b/src/taiga.lalrpop
index 6bf750d..6aedf42 100644
--- a/src/taiga.lalrpop
+++ b/src/taiga.lalrpop
@@ -8,10 +8,36 @@ pub Program: ast::Program = {
};
Expression: Box<ast::WithLocation<ast::Expression>> = {
- <e1:Expression> "+" <e2:ExpressionMul> => Box::new(e1.join_map(*e2, |v1, v2| {
+ <e1:Expression> "=" <e2:ExpressionCmp> => Box::new(e1.join_map(*e2, |v1, v2| {
+ ast::Expression::BinOp(ast::BinOp::Eq, Box::new(v1), Box::new(v2))
+ })),
+ <e1:Expression> "!=" <e2:ExpressionCmp> => Box::new(e1.join_map(*e2, |v1, v2| {
+ ast::Expression::BinOp(ast::BinOp::Neq, Box::new(v1), Box::new(v2))
+ })),
+ <ExpressionCmp> => <>,
+};
+
+ExpressionCmp: Box<ast::WithLocation<ast::Expression>> = {
+ <e1:ExpressionCmp> ">" <e2:ExpressionAdd> => Box::new(e1.join_map(*e2, |v1, v2| {
+ ast::Expression::BinOp(ast::BinOp::Gt, Box::new(v1), Box::new(v2))
+ })),
+ <e1:ExpressionCmp> "<" <e2:ExpressionAdd> => Box::new(e1.join_map(*e2, |v1, v2| {
+ ast::Expression::BinOp(ast::BinOp::Lt, Box::new(v1), Box::new(v2))
+ })),
+ <e1:ExpressionCmp> ">=" <e2:ExpressionAdd> => Box::new(e1.join_map(*e2, |v1, v2| {
+ ast::Expression::BinOp(ast::BinOp::Ge, Box::new(v1), Box::new(v2))
+ })),
+ <e1:ExpressionCmp> "<=" <e2:ExpressionAdd> => Box::new(e1.join_map(*e2, |v1, v2| {
+ ast::Expression::BinOp(ast::BinOp::Le, Box::new(v1), Box::new(v2))
+ })),
+ <ExpressionAdd> => <>,
+};
+
+ExpressionAdd: Box<ast::WithLocation<ast::Expression>> = {
+ <e1:ExpressionAdd> "+" <e2:ExpressionMul> => Box::new(e1.join_map(*e2, |v1, v2| {
ast::Expression::BinOp(ast::BinOp::Add, Box::new(v1), Box::new(v2))
})),
- <e1:Expression> "-" <e2:ExpressionMul> => Box::new(e1.join_map(*e2, |v1, v2| {
+ <e1:ExpressionAdd> "-" <e2:ExpressionMul> => Box::new(e1.join_map(*e2, |v1, v2| {
ast::Expression::BinOp(ast::BinOp::Sub, Box::new(v1), Box::new(v2))
})),
<ExpressionMul> => <>,