runningwater 3 лет назад
Родитель
Сommit
7e9609dc7a
2 измененных файлов с 30 добавлено и 0 удалено
  1. 13 0
      parser/parser.go
  2. 17 0
      parser/parser_test.go

+ 13 - 0
parser/parser.go

@@ -68,6 +68,7 @@ func New(l *lexer.Lexer) *Parser {
 	p.registerPrefix(token.MINUS, p.parsePrefixExpression)
 	p.registerPrefix(token.TRUE, p.parseBoolean)
 	p.registerPrefix(token.FALSE, p.parseBoolean)
+	p.registerPrefix(token.LPAREN, p.parseGroupedExpression)
 
 	p.infixParseFns = make(map[token.TypeToken]infixParseFn)
 	p.registerInfix(token.PLUS, p.parseInfixExpression)
@@ -93,6 +94,18 @@ func (p *Parser) parseIdentifier() ast.Expression {
 func (p *Parser) parseBoolean() ast.Expression {
 	return &ast.Boolean{Token: p.curToken, Value: p.curTokenIs(token.TRUE)}
 }
+func (p *Parser) parseGroupedExpression() ast.Expression {
+	defer untrace(trace("parseGroupedExpression"))
+	p.nextToken()
+
+	exp := p.parseExpression(LOWEST)
+
+	if !p.expectPeek(token.RPAREN) {
+		return nil
+	}
+
+	return exp
+}
 func (p *Parser) parseIntegerLiteral() ast.Expression {
 	defer untrace(trace("parseIntegerLiteral"))
 

+ 17 - 0
parser/parser_test.go

@@ -399,6 +399,23 @@ func TestOperatorPrecedenceParsing(t *testing.T) {
 			"3 > 5 == false",
 			"((3 > 5) == false)",
 		},
+		{
+			"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 {