From 715e2b4be2d839e2bfb550b144074cf3952ecac3 Mon Sep 17 00:00:00 2001 From: zhuliquan Date: Thu, 28 Mar 2024 00:10:08 +0800 Subject: [PATCH 1/2] feat: extract code for compiling equal operator --- compiler/compiler.go | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index 808b53c9b..a38d977d5 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -395,34 +395,12 @@ func (c *compiler) UnaryNode(node *ast.UnaryNode) { } func (c *compiler) BinaryNode(node *ast.BinaryNode) { - l := kind(node.Left) - r := kind(node.Right) - - leftIsSimple := isSimpleType(node.Left) - rightIsSimple := isSimpleType(node.Right) - leftAndRightAreSimple := leftIsSimple && rightIsSimple - switch node.Operator { case "==": - c.compile(node.Left) - c.derefInNeeded(node.Left) - c.compile(node.Right) - c.derefInNeeded(node.Right) - - if l == r && l == reflect.Int && leftAndRightAreSimple { - c.emit(OpEqualInt) - } else if l == r && l == reflect.String && leftAndRightAreSimple { - c.emit(OpEqualString) - } else { - c.emit(OpEqual) - } + c.equalBinaryNode(node) case "!=": - c.compile(node.Left) - c.derefInNeeded(node.Left) - c.compile(node.Right) - c.derefInNeeded(node.Right) - c.emit(OpEqual) + c.equalBinaryNode(node) c.emit(OpNot) case "or", "||": @@ -580,6 +558,28 @@ func (c *compiler) BinaryNode(node *ast.BinaryNode) { } } +func (c *compiler) equalBinaryNode(node *ast.BinaryNode) { + l := kind(node.Left) + r := kind(node.Right) + + leftIsSimple := isSimpleType(node.Left) + rightIsSimple := isSimpleType(node.Right) + leftAndRightAreSimple := leftIsSimple && rightIsSimple + + c.compile(node.Left) + c.derefInNeeded(node.Left) + c.compile(node.Right) + c.derefInNeeded(node.Right) + + if l == r && l == reflect.Int && leftAndRightAreSimple { + c.emit(OpEqualInt) + } else if l == r && l == reflect.String && leftAndRightAreSimple { + c.emit(OpEqualString) + } else { + c.emit(OpEqual) + } +} + func isSimpleType(node ast.Node) bool { if node == nil { return false From 2eed2d8a31fc4424a55c7bc11475d5a95aa8bff0 Mon Sep 17 00:00:00 2001 From: zhuliquan Date: Wed, 10 Apr 2024 00:10:27 +0800 Subject: [PATCH 2/2] feat: support last argument append with comma --- parser/parser.go | 7 +++++++ parser/parser_test.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/parser/parser.go b/parser/parser.go index febfb051a..243b3fe30 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -553,6 +553,10 @@ func (p *parser) parseCall(token Token, arguments []Node, checkOverrides bool) N arguments = append(arguments, node) } + // skip last comma + if p.current.Is(Operator, ",") { + p.next() + } p.expect(Bracket, ")") node = p.createNode(&BuiltinNode{ @@ -597,6 +601,9 @@ func (p *parser) parseArguments(arguments []Node) []Node { if len(arguments) > offset { p.expect(Operator, ",") } + if p.current.Is(Bracket, ")") { + break + } node := p.parseExpression(0) arguments = append(arguments, node) } diff --git a/parser/parser_test.go b/parser/parser_test.go index 3a7bb461a..1a15d77a8 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -839,6 +839,42 @@ world`}, Expr: &IdentifierNode{Value: "x"}, }, }, + { + `all( + [ + true, + false, + ], + #, + )`, + &BuiltinNode{ + Name: "all", + Arguments: []Node{ + &ArrayNode{ + Nodes: []Node{ + &BoolNode{Value: true}, + &BoolNode{Value: false}, + }, + }, + &PredicateNode{ + Node: &PointerNode{}, + }, + }, + }, + }, + { + `func( + parameter1, + parameter2, + )`, + &CallNode{ + Callee: &IdentifierNode{Value: "func"}, + Arguments: []Node{ + &IdentifierNode{Value: "parameter1"}, + &IdentifierNode{Value: "parameter2"}, + }, + }, + }, } for _, test := range tests { t.Run(test.input, func(t *testing.T) {