package main import ( "os" "bufio" "main/walk" ) type Program []Command type ProgramState struct { path, value, xreg, yreg, zreg []walk.Atom in walk.JSONIn out walk.JSONOut program []Command } func main() { quiet := false var input string hasInput := false for i := 1; i < len(os.Args); i += 1 { switch os.Args[i] { case "-n": quiet = true continue } if i < len(os.Args) - 1 { panic("Unexpected arguments after program") } input = os.Args[i] hasInput = true } if !hasInput { panic("Missing program") } tokens := Lex(input) program := Parse(tokens) stdin := bufio.NewReader(os.Stdin) stdout := bufio.NewWriter(os.Stdout) state := ProgramState { in: walk.NewJSONIn(stdin), out: walk.NewJSONOut(stdout), program: program, } for { walkItem, err := state.in.Read() if err != nil { break } state.value = walkItem.Value state.path = walkItem.Path for _, cmd := range state.program { cmd.exec(&state) } if !quiet { pathValues, err := walk.Compound(state.path) if err != nil { panic("Tried to convert invalid atoms to values") } path := walk.PathFromWalkValues(pathValues) state.out.Print(path, state.value) } } state.in.AssertDone() state.out.AssertDone() }