package ast import "git.akyoto.dev/cli/q/src/token" // eachInstruction calls the function on each AST node. func eachInstruction(tokens token.List, call func(token.List) error) error { start := 0 groupLevel := 0 blockLevel := 0 for i, t := range tokens { switch t.Kind { case token.NewLine: if start == i { start = i + 1 continue } if groupLevel > 0 || blockLevel > 0 { continue } err := call(tokens[start:i]) if err != nil { return err } start = i + 1 case token.GroupStart: groupLevel++ case token.GroupEnd: groupLevel-- case token.BlockStart: blockLevel++ case token.BlockEnd: blockLevel-- if groupLevel > 0 || blockLevel > 0 { continue } err := call(tokens[start : i+1]) if err != nil { return err } start = i + 1 case token.EOF: if start < i { return call(tokens[start:i]) } return nil } } if start < len(tokens) { return call(tokens[start:]) } return nil }