summaryrefslogtreecommitdiff
path: root/src/pkg/exp/eval/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/exp/eval/main.go')
-rw-r--r--src/pkg/exp/eval/main.go92
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());
+ }
+ }
+}
+