q/src/ast/eachInstruction.go
2025-02-21 11:45:32 +01:00

69 lines
999 B
Go

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
}