From aed19195e4476ed6933eac2d1d748bcdcb4277e7 Mon Sep 17 00:00:00 2001 From: Bobby Date: Sat, 4 Nov 2023 20:20:04 -0400 Subject: parser:prefix ! and - --- parser/parser.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/parser/parser.go b/parser/parser.go index d236bf0..b9fb91f 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -52,6 +52,8 @@ func New(l *lexer.Lexer) *Parser { p.prefixParseFns = make(map[tokens.TokenType]prefixParseFn) p.registerPrefix(tokens.IDENT, p.parseIdentifier) p.registerPrefix(tokens.INT, p.parseIntegerLiteral) + p.registerPrefix(tokens.BANG, p.parsePrefixExpression) + p.registerPrefix(tokens.MINUS, p.parsePrefixExpression) return p } @@ -182,11 +184,19 @@ func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement { return stmt } +// noPrefixParseFnError returns an error message. +func (p *Parser) noPrefixParseFnError(t tokens.TokenType) { + var msg string = fmt.Sprintf("no prefix parse function for %s found", t) + + p.errors = append(p.errors, msg) +} + // parseExpression parses an expression. func (p *Parser) parseExpression(precedence int) ast.Expression { var prefix = p.prefixParseFns[p.curToken.Type] if prefix == nil { + p.noPrefixParseFnError(p.curToken.Type) return nil } @@ -195,6 +205,20 @@ func (p *Parser) parseExpression(precedence int) ast.Expression { return leftExp } +// parsePrefixExpression parses a prefix expression. +func (p *Parser) parsePrefixExpression() ast.Expression { + var expression *ast.PrefixExpression = &ast.PrefixExpression{ + Token: p.curToken, + Operator: p.curToken.Literal, + } + + p.nextToken() + + expression.Right = p.parseExpression(PREFIX) + + return expression +} + // curTokenIs returns true if the current token is of the given type. func (p *Parser) curTokenIs(t tokens.TokenType) bool { return p.curToken.Type == t -- cgit v1.2.3