From 4acc09faf9231770cc2dff86902e9269e6ab6410 Mon Sep 17 00:00:00 2001 From: jmug Date: Sun, 5 Jan 2025 11:37:13 -0800 Subject: [PATCH] Parsed grouped expressions (that was easy!). Signed-off-by: jmug --- pkg/parser/parser.go | 11 +++++++++++ pkg/parser/parser_test.go | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index 1ba76c2..9223f43 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -37,6 +37,7 @@ func New(l *lexer.Lexer) *Parser { p.registerPrefix(token.BANG, p.parsePrefixExpression) p.registerPrefix(token.TRUE, p.parseBoolean) p.registerPrefix(token.FALSE, p.parseBoolean) + p.registerPrefix(token.LPAREN, p.parseGroupedExpression) // Infix registrations p.registerInfix(token.PLUS, p.parseInfixExpression) p.registerInfix(token.MINUS, p.parseInfixExpression) @@ -176,6 +177,16 @@ func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { return exp } +func (p *Parser) parseGroupedExpression() ast.Expression { + p.nextToken() + exp := p.parseExpression(LOWEST) + if !p.expectPeek(token.RPAREN) { + // TODO: Would probably be good to emit an error here? + return nil + } + return exp +} + func (p *Parser) curTokenIs(typ token.TokenType) bool { return p.curToken.Type == typ } diff --git a/pkg/parser/parser_test.go b/pkg/parser/parser_test.go index b96dfbe..ca2a979 100644 --- a/pkg/parser/parser_test.go +++ b/pkg/parser/parser_test.go @@ -316,6 +316,26 @@ func TestOperatorPrecedenceParsing(t *testing.T) { "3 < 5 == true", "((3 < 5) == true)", }, + { + "1 + (2 + 3) + 4", + "((1 + (2 + 3)) + 4)", + }, + { + "(5 + 5) * 2", + "((5 + 5) * 2)", + }, + { + "2 / (5 + 5)", + "(2 / (5 + 5))", + }, + { + "-(5 + 5)", + "(-(5 + 5))", + }, + { + "!(true == true)", + "(!(true == true))", + }, } for _, tt := range tests {