From 13e7a55d3924f77fccf8b97a2373dfb29eba6e5a Mon Sep 17 00:00:00 2001 From: David Li Date: Sat, 4 Nov 2017 19:38:55 -0400 Subject: Parse logical operators --- src/ast.rs | 3 +++ src/taiga.lalrpop | 18 ++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/ast.rs b/src/ast.rs index ab9493e..4eea431 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -38,6 +38,7 @@ pub struct Program(pub Box>); pub enum UnaryOp { Pos, Neg, + Not, } #[derive(Debug)] @@ -53,6 +54,8 @@ pub enum BinOp { Lt, Ge, Le, + And, + Or, } #[derive(Debug)] diff --git a/src/taiga.lalrpop b/src/taiga.lalrpop index 6aedf42..68238eb 100644 --- a/src/taiga.lalrpop +++ b/src/taiga.lalrpop @@ -8,10 +8,24 @@ pub Program: ast::Program = { }; Expression: Box> = { - "=" => Box::new(e1.join_map(*e2, |v1, v2| { + "&&" => Box::new(e1.join_map(*e2, |v1, v2| { + ast::Expression::BinOp(ast::BinOp::And, Box::new(v1), Box::new(v2)) + })), + "||" => Box::new(e1.join_map(*e2, |v1, v2| { + ast::Expression::BinOp(ast::BinOp::Or, Box::new(v1), Box::new(v2)) + })), + "!" => Box::new(WithLocation::new( + ast::Expression::UnaryOp(ast::UnaryOp::Not, e), + l, r + )), + => <>, +}; + +ExpressionEq: Box> = { + "=" => Box::new(e1.join_map(*e2, |v1, v2| { ast::Expression::BinOp(ast::BinOp::Eq, Box::new(v1), Box::new(v2)) })), - "!=" => Box::new(e1.join_map(*e2, |v1, v2| { + "!=" => Box::new(e1.join_map(*e2, |v1, v2| { ast::Expression::BinOp(ast::BinOp::Neq, Box::new(v1), Box::new(v2)) })), => <>, -- cgit v1.2.3