diff options
Diffstat (limited to 'src/pkg/exp/eval/main.go')
-rw-r--r-- | src/pkg/exp/eval/main.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/pkg/exp/eval/main.go b/src/pkg/exp/eval/main.go new file mode 100644 index 000000000..2a6d94845 --- /dev/null +++ b/src/pkg/exp/eval/main.go @@ -0,0 +1,92 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import ( + "./_obj/eval"; + "bufio"; + "flag"; + "go/parser"; + "go/scanner"; + "io"; + "os"; +) + +var filename = flag.String("f", "", "file to run"); + +func main() { + flag.Parse(); + w := eval.NewWorld(); + if *filename != "" { + data, err := io.ReadFile(*filename); + if err != nil { + println(err.String()); + os.Exit(1); + } + file, err := parser.ParseFile(*filename, data, 0); + if err != nil { + println(err.String()); + os.Exit(1); + } + code, err := w.CompileDeclList(file.Decls); + if err != nil { + if list, ok := err.(scanner.ErrorList); ok { + for _, e := range list { + println(e.String()); + } + } else { + println(err.String()); + } + os.Exit(1); + } + _, err := code.Run(); + if err != nil { + println(err.String()); + os.Exit(1); + } + code, err = w.Compile("init()"); + if code != nil { + _, err := code.Run(); + if err != nil { + println(err.String()); + os.Exit(1); + } + } + code, err = w.Compile("main()"); + if err != nil { + println(err.String()); + os.Exit(1); + } + _, err = code.Run(); + if err != nil { + println(err.String()); + os.Exit(1); + } + os.Exit(0); + } + + r := bufio.NewReader(os.Stdin); + for { + print("; "); + line, err := r.ReadString('\n'); + if err != nil { + break; + } + code, err := w.Compile(line); + if err != nil { + println(err.String()); + continue; + } + v, err := code.Run(); + if err != nil { + println(err.String()); + continue; + } + if v != nil { + println(v.String()); + } + } +} + |