aboutsummaryrefslogtreecommitdiff
path: root/parser
diff options
context:
space:
mode:
authorBobby <[email protected]>2023-11-04 20:20:04 -0400
committerBobby <[email protected]>2023-11-04 20:20:04 -0400
commitaed19195e4476ed6933eac2d1d748bcdcb4277e7 (patch)
tree4eb3261f7e5e5b066f11def4c997a34ffd6061ca /parser
parent0a868d6263ccd3de687eeb07d85b7e95056f8340 (diff)
downloadmana-aed19195e4476ed6933eac2d1d748bcdcb4277e7.tar.xz
mana-aed19195e4476ed6933eac2d1d748bcdcb4277e7.zip
parser:prefix ! and -
Diffstat (limited to 'parser')
-rw-r--r--parser/parser.go24
1 files changed, 24 insertions, 0 deletions
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