Parse if/else expressions

This commit is contained in:
Sasha Koshka 2024-02-07 18:25:42 -05:00
parent 790f1ca6be
commit 47ca7b98c6
1 changed files with 27 additions and 3 deletions

View File

@ -113,12 +113,36 @@ func (this *Parser) parseVariableOrDeclaration () (entity.Expression, error) {
}
func (this *Parser) parseIfElse () (*entity.IfElse, error) {
// TODO
panic(this.bug())
err := this.expectValue(lexer.Ident, "if")
if err != nil { return nil, err }
ifElse := &entity.IfElse {
Position: this.pos(),
}
err = this.expectNextDesc("Condition", startTokensExpression...)
if err != nil { return nil, err }
ifElse.Condition, err = this.parseExpression()
if err != nil { return nil, err }
err = this.expectValue(lexer.Ident, "then")
if err != nil { return nil, err }
this.expectNextDesc("Branch expression", startTokensExpression...)
ifElse.True, err = this.parseExpression()
if err != nil { return nil, err }
if this.token.Is(lexer.Ident) && this.token.ValueIs("else") {
// Ident "else": false branch expression
this.expectNextDesc("Branch expression", startTokensExpression...)
ifElse.False, err = this.parseExpression()
if err != nil { return nil, err }
}
return ifElse, nil
}
func (this *Parser) parseLoop () (*entity.Loop, error) {
err := this.expectDesc("Loop", lexer.Ident)
err := this.expectValue(lexer.Ident, "loop")
if err != nil { return nil, err }
pos := this.pos()