authorgravatar for 11367844+lino-levan@users.noreply.github.comLino Le Van <11367844+lino-levan@users.noreply.github.com> 2024-02-09 01:49:35+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-02-08 16:49:35-08:00
log5a950c1982ddcab8e8d84ec27310eb1e0afdeb1f
tree09a23d2d22fa1ff9a082a588395c41a48d2429e2
parent8e08f65f07fb0df63708095fd4537dd2c0fee7fb
signature Signed by PGP key B5690EEEBB952194

fix: associativity in the parser (#24)

* fix: associativity in the parser * chore: address dave comments part 1

3 files changed, 19 insertions(+), 41 deletions(-)

crates/ast/operators.rs+1
......@@ -244,6 +244,7 @@ pub enum OperatorLevel {
244244 Comma, // ,
245245}
246246
247#[derive(PartialEq)]
247248pub enum Associativity {
248249 LeftToRight,
249250 RightToLeft,
crates/parser/parse_expr.rs+12-41
......@@ -1,5 +1,4 @@
1use ast::Associativity::*;
2use ast::{BinaryOperator, Expr, ExprData, OperatorLevel};
1use ast::{Associativity, BinaryOperator, Expr, ExprData, OperatorLevel};
32use log::Range;
43use miette::Result;
54
......@@ -19,25 +18,8 @@ pub fn parse_expr(p: &mut Parser) -> Result<Expr> {
1918 if let Some(token) = p.peek() {
2019 if let Some(level) = BinaryOperator::from_token(&token).map(|o| o.level()) {
2120 _ = p.next();
22 match level.associativity() {
23 RightToLeft => {
24 expr = parse_expr_binary(
25 p,
26 BinaryOperator::from_token(&token).unwrap(),
27 expr,
28 level,
29 )?;
30 }
31 LeftToRight => {
32 // TODO(@paperdave): TODO
33 expr = parse_expr_binary(
34 p,
35 BinaryOperator::from_token(&token).unwrap(),
36 expr,
37 level,
38 )?;
39 }
40 }
21 expr =
22 parse_expr_binary(p, BinaryOperator::from_token(&token).unwrap(), expr, level)?;
4123 continue;
4224 }
4325 }
......@@ -60,27 +42,16 @@ fn parse_expr_binary(
6042 loop {
6143 if let Some(token) = p.peek() {
6244 if let Some(new_level) = BinaryOperator::from_token(&token).map(|o| o.level()) {
63 if new_level <= level {
45 if (level.associativity() == Associativity::LeftToRight && new_level < level)
46 || (level.associativity() == Associativity::RightToLeft && new_level <= level)
47 {
6448 _ = p.next();
65 match new_level.associativity() {
66 RightToLeft => {
67 right = parse_expr_binary(
68 p,
69 BinaryOperator::from_token(&token).unwrap(),
70 right,
71 new_level,
72 )?;
73 }
74 LeftToRight => {
75 // TODO(@paperdave): TODO
76 right = parse_expr_binary(
77 p,
78 BinaryOperator::from_token(&token).unwrap(),
79 right,
80 new_level,
81 )?;
82 }
83 }
49 right = parse_expr_binary(
50 p,
51 BinaryOperator::from_token(&token).unwrap(),
52 right,
53 new_level,
54 )?;
8455 continue;
8556 }
8657 }
examples/basics/associativity.blight created+6
......@@ -0,0 +1,6 @@
1let print = @raw("console.log");
2print(1 * 2 * 3);
3print(1 * 2 / 3);
4print(1 + 2 ** 3);
5print(1 ** 2 ** 3);
6print(1 * 2 + 3);