| // 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 ( |
| "bufio" |
| "exp/eval" |
| "flag" |
| "go/parser" |
| "go/scanner" |
| "go/token" |
| "io/ioutil" |
| "os" |
| ) |
| |
| var fset = token.NewFileSet() |
| var filename = flag.String("f", "", "file to run") |
| |
| func main() { |
| flag.Parse() |
| w := eval.NewWorld() |
| if *filename != "" { |
| data, err := ioutil.ReadFile(*filename) |
| if err != nil { |
| println(err.String()) |
| os.Exit(1) |
| } |
| file, err := parser.ParseFile(fset, *filename, data, 0) |
| if err != nil { |
| println(err.String()) |
| os.Exit(1) |
| } |
| code, err := w.CompileDeclList(fset, 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(fset, "init()") |
| if code != nil { |
| _, err := code.Run() |
| if err != nil { |
| println(err.String()) |
| os.Exit(1) |
| } |
| } |
| code, err = w.Compile(fset, "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(fset, 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()) |
| } |
| } |
| } |