From a4b75cf9c20df179aa37ae5187e675c78cd4aa2a Mon Sep 17 00:00:00 2001 From: tijani Date: Thu, 14 Jul 2022 12:23:22 +0000 Subject: [PATCH] Changes: - Parsing grouped expressions is now possible - formatting git-svn-id: https://svn.tlawal.org/svn/monkey@34 f6afcba9-9ef1-4bdd-9b72-7484f5705bac --- ast/ast.go | 4 ++-- parser/parser.go | 12 ++++++++++++ parser/parser_test.go | 20 ++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index 200c64b..2fedfc8 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -189,6 +189,6 @@ func (ie *InfixExpression) String() string { } // Booleans -func (b *Boolean) expression_node() {} +func (b *Boolean) expression_node() {} func (b *Boolean) TokenLiteral() string { return b.Token.Literal } -func (b *Boolean) String() string { return b.Token.Literal} +func (b *Boolean) String() string { return b.Token.Literal } diff --git a/parser/parser.go b/parser/parser.go index 26530b8..11e7c69 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -100,6 +100,9 @@ func New(l_lexer *lexer.Lexer) *Parser { l_parser.register_prefix(token.TRUE, l_parser.parse_boolean) l_parser.register_prefix(token.FALSE, l_parser.parse_boolean) + // Grouped Expression + l_parser.register_prefix(token.LPAREN, l_parser.parse_grouped_expression) + return l_parser } @@ -278,3 +281,12 @@ func (l_parser *Parser) parse_boolean() ast.Expression { Value: l_parser.current_token_is(token.TRUE), } } + +func (l_parser *Parser) parse_grouped_expression() ast.Expression{ + l_parser.next_token() + expression := l_parser.parse_expression(LOWEST) + if !l_parser.expect_peek(token.RPAREN){ + return nil + } + return expression +} diff --git a/parser/parser_test.go b/parser/parser_test.go index 85ce650..079d43e 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -290,6 +290,26 @@ func TestOperatorPrecedenceParsing(l_test *testing.T) { "3 < 5 == true", "((3 < 5) == true)", }, + { + "3 < 5 == true", + "((3 < 5) == true)", + }, + { + "(5 + 5) * 2", + "((5 + 5) * 2)", + }, + { + "2 / (5 + 5)", + "(2 / (5 + 5))", + }, + { + "-(5 + 5)", + "(-(5 + 5))", + }, + { + "!(true == true)", + "(!(true == true))", + }, } for _, tt := range tests { l_lexer := lexer.New(tt.input)