| // 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()) | |
| } | |
| } | |
| } |