For loop generation stub

This commit is contained in:
Sasha Koshka
2024-03-20 02:09:26 -04:00
parent 86d4f21036
commit 789ffa85d2
3 changed files with 42 additions and 0 deletions

View File

@@ -397,3 +397,21 @@ testString (test,
}
`)
}
func TestFor (test *testing.T) {
testString (test,
`
`,
`
[print x:Byte]
[f str:String] = for c:Byte in str { [print c] }
[g str:String] = for i:Index c:Byte in str [print c]
`)}
func TestForBreak (test *testing.T) {
testString (test,
`
`,
`
[f str:String]:Byte = for c:Byte in str [break c]
`)}

View File

@@ -161,6 +161,9 @@ func (this *generator) generateExpressionVal (expression entity.Expression) (llv
case *entity.Loop:
val, _, err := this.generateLoop(expression, resultModeVal)
return val, err
case *entity.For:
val, _, err := this.generateFor(expression, resultModeVal)
return val, err
case *entity.LiteralInt:
return this.generateLiteralInt(expression)
case *entity.LiteralFloat:

View File

@@ -198,3 +198,24 @@ func (this *generator) generateLoop (loop *entity.Loop, mode resultMode) (llvm.V
}
return loopEntry.value, loopEntry.loc, nil
}
func (this *generator) generateFor (loop *entity.For, mode resultMode) (llvm.Value, bool, error) {
irIndexType, err := this.blockManager.generateTypeIndex()
if err != nil { return nil, false, err }
// element index
var irIndex llvm.Value
if loop.Index != nil {
irIndex, err = this.blockManager.addDeclaration (
loop.Index, llvm.NewConstZeroInitializer(irIndexType))
if err != nil { return nil, false, err }
}
// element value
irElement, err := this.blockManager.addDeclaration(loop.Element, nil)
if err != nil { return nil, false, err }
// TODO
previous := this.
}