diff options
| author | Bobby <[email protected]> | 2024-01-24 21:03:26 +0000 |
|---|---|---|
| committer | Bobby <[email protected]> | 2024-01-24 21:03:26 +0000 |
| commit | c07b5f8fd0cf8bd1654825dcf7401d670fda4c0a (patch) | |
| tree | 21630a57b47598ddf58f9428e265157ce9206fc8 /parser/parser.go | |
| parent | b7d832da734647049f28c6994292d77b6e2c60eb (diff) | |
| download | mana-c07b5f8fd0cf8bd1654825dcf7401d670fda4c0a.tar.xz mana-c07b5f8fd0cf8bd1654825dcf7401d670fda4c0a.zip | |
If-Else Parsing
Diffstat (limited to 'parser/parser.go')
| -rw-r--r-- | parser/parser.go | 44 |
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 |
