From d449632c5bb2f67ed9cf22934855684a3ea2c289 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Tue, 20 Oct 2020 13:09:23 -0700 Subject: [PATCH] Fix operator precedence in the parser Operator precedence is applied only when the two rules are the same. This is now fixed. Signed-off-by: Alek Ratzloff --- src/syn/parser.y | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/syn/parser.y b/src/syn/parser.y index 57e5822..a657b50 100644 --- a/src/syn/parser.y +++ b/src/syn/parser.y @@ -1,12 +1,11 @@ %start Body - -%left '||' -%left '&&' -%left '<' '>' '<=' '>=' '==' '!=' -%left '*' '/' %left '+' '-' +%left '*' '/' +%left '<' '>' '<=' '>=' '==' '!=' +%left '&&' +%left '||' -%avoid_insert "NUM" "SYM" "STRING" "||" "&&" "<" ">" "<=" ">=" "!=" "==" "+" "-" "*" "/" "{" +//%avoid_insert "NUM" "SYM" "STRING" "||" "&&" "<" ">" "<=" ">=" "!=" "==" "+" "-" "*" "/" "{" %% @@ -50,18 +49,18 @@ Return -> Result: Expr -> Result: BinExpr { $1 }; BinExpr -> Result: - UnExpr '||' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Or, $3?)) } - | UnExpr '&&' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::And, $3?)) } - | UnExpr '<' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Lt, $3?)) } - | UnExpr '>' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Gt, $3?)) } - | UnExpr '<=' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Le, $3?)) } - | UnExpr '>=' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Ge, $3?)) } - | UnExpr '==' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Eq, $3?)) } - | UnExpr '!=' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Neq, $3?)) } - | UnExpr '*' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Times, $3?)) } - | UnExpr '/' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Div, $3?)) } - | UnExpr '+' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Plus, $3?)) } - | UnExpr '-' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Minus, $3?)) } + BinExpr '||' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Or, $3?)) } + | BinExpr '&&' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::And, $3?)) } + | BinExpr '<' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Lt, $3?)) } + | BinExpr '>' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Gt, $3?)) } + | BinExpr '<=' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Le, $3?)) } + | BinExpr '>=' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Ge, $3?)) } + | BinExpr '==' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Eq, $3?)) } + | BinExpr '!=' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Neq, $3?)) } + | BinExpr '*' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Times, $3?)) } + | BinExpr '/' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Div, $3?)) } + | BinExpr '+' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Plus, $3?)) } + | BinExpr '-' BinExpr { Ok(BinExpr::new_expr($1?, BinOp::Minus, $3?)) } | UnExpr { $1 } ;