aboutsummaryrefslogtreecommitdiff
path: root/parser/parser.go
diff options
context:
space:
mode:
authorBobby <[email protected]>2024-01-24 21:03:26 +0000
committerBobby <[email protected]>2024-01-24 21:03:26 +0000
commitc07b5f8fd0cf8bd1654825dcf7401d670fda4c0a (patch)
tree21630a57b47598ddf58f9428e265157ce9206fc8 /parser/parser.go
parentb7d832da734647049f28c6994292d77b6e2c60eb (diff)
downloadmana-c07b5f8fd0cf8bd1654825dcf7401d670fda4c0a.tar.xz
mana-c07b5f8fd0cf8bd1654825dcf7401d670fda4c0a.zip
If-Else Parsing
Diffstat (limited to 'parser/parser.go')
-rw-r--r--parser/parser.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/parser/parser.go b/parser/parser.go
index 310acee..e38e54c 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -67,6 +67,7 @@ func New(l *lexer.Lexer) *Parser {
p.registerPrefix(tokens.MINUS, p.parsePrefixExpression)
p.registerPrefix(tokens.TRUE, p.parseBoolean)
p.registerPrefix(tokens.FALSE, p.parseBoolean)
+ p.registerPrefix(tokens.IF, p.parseIfExpression)
// Initialize the infix parse functions.
p.infixParseFns = make(map[tokens.TokenType]infixParseFn)
@@ -286,6 +287,49 @@ func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression {
return expression
}
+func (p *Parser) parseIfExpression() ast.Expression {
+ expression := &ast.IfExpression{Token: p.curToken}
+
+ if !p.expectPeek(tokens.LPAREN) { return nil }
+
+ p.nextToken()
+ expression.Condition = p.parseExpression(LOWEST)
+
+ if !p.expectPeek(tokens.RPAREN) { return nil }
+
+ if !p.expectPeek(tokens.LBRACE) { return nil }
+
+ expression.Consequence = p.parseBlockStatement()
+
+ if p.peekTokenIs(tokens.ELSE) {
+ p.nextToken()
+
+ if !p.expectPeek(tokens.LBRACE) { return nil }
+
+ expression.Alternative = p.parseBlockStatement()
+ }
+
+ return expression
+}
+
+func (p *Parser) parseBlockStatement() *ast.BlockStatement {
+ block := &ast.BlockStatement{Token: p.curToken}
+ block.Statements = []ast.Statement{}
+
+ p.nextToken()
+
+ for !p.curTokenIs(tokens.RBRACE) && !p.curTokenIs(tokens.EOF) {
+ stmt := p.parseStatement()
+ if stmt != nil {
+ block.Statements = append(block.Statements, stmt)
+ }
+
+ p.nextToken()
+ }
+
+ return block
+}
+
// 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