From 9891204b026c7660676f456128c94b01ae7f39cf Mon Sep 17 00:00:00 2001 From: David Li Date: Sat, 4 Nov 2017 19:33:45 -0400 Subject: Parse comparison operators --- src/ast.rs | 6 ++++++ src/taiga.lalrpop | 30 ++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/ast.rs b/src/ast.rs index 97ed91d..ab9493e 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -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> = { - "+" => Box::new(e1.join_map(*e2, |v1, v2| { + "=" => 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| { + ast::Expression::BinOp(ast::BinOp::Neq, Box::new(v1), Box::new(v2)) + })), + => <>, +}; + +ExpressionCmp: Box> = { + ">" => Box::new(e1.join_map(*e2, |v1, v2| { + ast::Expression::BinOp(ast::BinOp::Gt, Box::new(v1), Box::new(v2)) + })), + "<" => Box::new(e1.join_map(*e2, |v1, v2| { + ast::Expression::BinOp(ast::BinOp::Lt, Box::new(v1), Box::new(v2)) + })), + ">=" => Box::new(e1.join_map(*e2, |v1, v2| { + ast::Expression::BinOp(ast::BinOp::Ge, Box::new(v1), Box::new(v2)) + })), + "<=" => Box::new(e1.join_map(*e2, |v1, v2| { + ast::Expression::BinOp(ast::BinOp::Le, Box::new(v1), Box::new(v2)) + })), + => <>, +}; + +ExpressionAdd: Box> = { + "+" => Box::new(e1.join_map(*e2, |v1, v2| { ast::Expression::BinOp(ast::BinOp::Add, 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::Sub, Box::new(v1), Box::new(v2)) })), => <>, -- cgit v1.2.3