diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast.rs | 6 | ||||
-rw-r--r-- | src/taiga.lalrpop | 30 |
2 files changed, 34 insertions, 2 deletions
@@ -47,6 +47,12 @@ pub enum BinOp { Mul, Div, FloorDiv, + Eq, + Neq, + Gt, + Lt, + Ge, + Le, } #[derive(Debug)] 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> => <>, |