Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package core
import ( "git.urbach.dev/cli/q/src/ast" "git.urbach.dev/cli/q/src/errors" "git.urbach.dev/cli/q/src/token")
// compileLoopControl compiles loop control statements.func (f *Function) compileLoopControl(control *ast.LoopControl) error { call := control.Expression
if call.Token.Kind != token.Call { return errors.New(InvalidExpression, f.File, control.Expression.Source()) }
if len(call.Children) != 1 { return errors.New(InvalidExpression, f.File, control.Expression.Source()) }
loop := f.loopStack.Current()
if loop == nil { return errors.New(LoopControlWithoutLoop, f.File, control.Expression.Source()) }
name := call.Children[0].Token.StringFrom(f.File.Bytes)
switch name { case "next": f.loopNext(loop) case "restart": // reserved case "stop": f.jump(loop.Exit) default: correctName := ""
if name == "break" { correctName = "stop" }
return errors.New(&InvalidLoopControl{Name: name, CorrectName: correctName}, f.File, call.Children[0].Source()) }
return nil}