From 8ab65fb55f2d2e95cd5664edaccfe6abb4955aff Mon Sep 17 00:00:00 2001 From: David Stotijn Date: Tue, 17 Nov 2020 21:34:59 +0100 Subject: [PATCH] Support implicit boolean expression nested in groups --- pkg/search/parser.go | 17 ++++++++++++++--- pkg/search/parser_test.go | 10 ++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/pkg/search/parser.go b/pkg/search/parser.go index ec0ad41..92f4d29 100644 --- a/pkg/search/parser.go +++ b/pkg/search/parser.go @@ -9,10 +9,10 @@ type precedence int const ( _ precedence = iota precLowest + precEq precAnd precOr precNot - precEq precLessGreater precPrefix precGroup @@ -218,8 +218,19 @@ func parseGroupedExpression(p *Parser) (Expression, error) { return nil, fmt.Errorf("could not parse grouped expression: %v", err) } - if err := p.expectPeek(TokParenClose); err != nil { - return nil, err + for p.nextToken(); !p.curTokenIs(TokParenClose); p.nextToken() { + if p.curTokenIs(TokEOF) { + return nil, fmt.Errorf("unexpected EOF: unmatched parentheses") + } + right, err := p.parseExpression(precLowest) + if err != nil { + return nil, fmt.Errorf("could not parse expression: %v", err) + } + expr = &InfixExpression{ + Operator: TokOpAnd, + Left: expr, + Right: right, + } } return expr, nil diff --git a/pkg/search/parser_test.go b/pkg/search/parser_test.go index b07f4c7..3915c5e 100644 --- a/pkg/search/parser_test.go +++ b/pkg/search/parser_test.go @@ -153,6 +153,16 @@ func TestParseQuery(t *testing.T) { }, expectedError: nil, }, + { + name: "implicit boolean expression nested in group", + input: "(foo bar)", + expectedExpression: &InfixExpression{ + Operator: TokOpAnd, + Left: &StringLiteral{Value: "foo"}, + Right: &StringLiteral{Value: "bar"}, + }, + expectedError: nil, + }, { name: "implicit and explicit boolean expression with string literal operands", input: "foo bar OR baz yolo",