From 1d0ade2d61327db7cf20951ada8cb1ae9ea9e7ee Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 18 Mar 2025 10:46:25 +0100 Subject: [PATCH] Fix parsing of variable declaration nodes combined with sequence node Fixes #772 --- parser/parser.go | 6 ++-- parser/parser_test.go | 72 +++++++++++++++++++++++++++++++------------ 2 files changed, 56 insertions(+), 22 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index 5ba16d2a2..91c0fa8f8 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -323,13 +323,13 @@ func (p *parser) parseConditional(node Node) Node { p.next() if !p.current.Is(Operator, ":") { - expr1 = p.parseSequenceExpression() + expr1 = p.parseExpression(0) p.expect(Operator, ":") - expr2 = p.parseSequenceExpression() + expr2 = p.parseExpression(0) } else { p.next() expr1 = node - expr2 = p.parseSequenceExpression() + expr2 = p.parseExpression(0) } node = p.createNode(&ConditionalNode{ diff --git a/parser/parser_test.go b/parser/parser_test.go index 9c707856d..16dac6b79 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -683,18 +683,20 @@ world`}, }, }, { - "true ? 1; 2; 3 : 4", - &ConditionalNode{ - Cond: &BoolNode{Value: true}, - Exp1: &SequenceNode{ - Nodes: []Node{ - &IntegerNode{Value: 1}, - &IntegerNode{Value: 2}, - &IntegerNode{Value: 3}}}, - Exp2: &IntegerNode{Value: 4}}, + "true ? 1 : 2; 3 ; 4", + &SequenceNode{ + Nodes: []Node{ + &ConditionalNode{ + Cond: &BoolNode{Value: true}, + Exp1: &IntegerNode{Value: 1}, + Exp2: &IntegerNode{Value: 2}}, + &IntegerNode{Value: 3}, + &IntegerNode{Value: 4}, + }, + }, }, { - "true ? 1 : 2; 3 ; 4", + "true ? 1 : ( 2; 3; 4 )", &ConditionalNode{ Cond: &BoolNode{Value: true}, Exp1: &IntegerNode{Value: 1}, @@ -702,18 +704,50 @@ world`}, Nodes: []Node{ &IntegerNode{Value: 2}, &IntegerNode{Value: 3}, - &IntegerNode{Value: 4}}}}, + &IntegerNode{Value: 4}, + }, + }, + }, }, { "true ?: 1; 2; 3", - &ConditionalNode{ - Cond: &BoolNode{Value: true}, - Exp1: &BoolNode{Value: true}, - Exp2: &SequenceNode{ - Nodes: []Node{ - &IntegerNode{Value: 1}, - &IntegerNode{Value: 2}, - &IntegerNode{Value: 3}}}}, + &SequenceNode{ + Nodes: []Node{ + &ConditionalNode{ + Cond: &BoolNode{Value: true}, + Exp1: &BoolNode{Value: true}, + Exp2: &IntegerNode{Value: 1}}, + &IntegerNode{Value: 2}, + &IntegerNode{Value: 3}, + }, + }, + }, + { + `let x = true ? 1 : 2; x`, + &VariableDeclaratorNode{ + Name: "x", + Value: &ConditionalNode{ + Cond: &BoolNode{Value: true}, + Exp1: &IntegerNode{Value: 1}, + Exp2: &IntegerNode{Value: 2}}, + Expr: &IdentifierNode{Value: "x"}}, + }, + { + "let x = true ? 1 : ( 2; 3; 4 ); x", + &VariableDeclaratorNode{ + Name: "x", + Value: &ConditionalNode{ + Cond: &BoolNode{Value: true}, + Exp1: &IntegerNode{Value: 1}, + Exp2: &SequenceNode{ + Nodes: []Node{ + &IntegerNode{Value: 2}, + &IntegerNode{Value: 3}, + &IntegerNode{Value: 4}, + }, + }, + }, + Expr: &IdentifierNode{Value: "x"}}, }, { "if true { 1; 2; 3 } else { 4; 5; 6 }",