2009-09-02 17:15:43 -07:00
|
|
|
// 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 (
|
2009-12-15 15:27:16 -08:00
|
|
|
"./_obj/eval"
|
|
|
|
|
"bufio"
|
|
|
|
|
"flag"
|
|
|
|
|
"go/parser"
|
|
|
|
|
"go/scanner"
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
2009-09-02 17:15:43 -07:00
|
|
|
)
|
|
|
|
|
|
2009-11-05 14:41:56 -08:00
|
|
|
var filename = flag.String("f", "", "file to run")
|
2009-10-11 02:35:53 -07:00
|
|
|
|
2009-09-02 17:15:43 -07:00
|
|
|
func main() {
|
2009-12-15 15:27:16 -08:00
|
|
|
flag.Parse()
|
|
|
|
|
w := eval.NewWorld()
|
2009-10-11 02:35:53 -07:00
|
|
|
if *filename != "" {
|
2009-12-15 15:27:16 -08:00
|
|
|
data, err := ioutil.ReadFile(*filename)
|
2009-10-11 02:35:53 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
os.Exit(1)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
file, err := parser.ParseFile(*filename, data, 0)
|
2009-10-11 02:35:53 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
os.Exit(1)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
code, err := w.CompileDeclList(file.Decls)
|
2009-10-11 02:35:53 -07:00
|
|
|
if err != nil {
|
|
|
|
|
if list, ok := err.(scanner.ErrorList); ok {
|
|
|
|
|
for _, e := range list {
|
2009-11-09 12:07:39 -08:00
|
|
|
println(e.String())
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
|
|
|
|
} else {
|
2009-11-09 12:07:39 -08:00
|
|
|
println(err.String())
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
os.Exit(1)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
_, err := code.Run()
|
2009-10-11 02:35:53 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
os.Exit(1)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
code, err = w.Compile("init()")
|
2009-10-11 02:35:53 -07:00
|
|
|
if code != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
_, err := code.Run()
|
2009-10-11 02:35:53 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
os.Exit(1)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
|
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
code, err = w.Compile("main()")
|
2009-10-11 02:35:53 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
os.Exit(1)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
_, err = code.Run()
|
2009-10-11 02:35:53 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
os.Exit(1)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
os.Exit(0)
|
2009-10-11 02:35:53 -07:00
|
|
|
}
|
|
|
|
|
|
2009-12-15 15:27:16 -08:00
|
|
|
r := bufio.NewReader(os.Stdin)
|
2009-09-02 17:15:43 -07:00
|
|
|
for {
|
2009-12-15 15:27:16 -08:00
|
|
|
print("; ")
|
|
|
|
|
line, err := r.ReadString('\n')
|
2009-09-02 17:15:43 -07:00
|
|
|
if err != nil {
|
2009-11-09 12:07:39 -08:00
|
|
|
break
|
2009-09-02 17:15:43 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
code, err := w.Compile(line)
|
2009-09-02 17:15:43 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
continue
|
2009-09-02 17:15:43 -07:00
|
|
|
}
|
2009-12-15 15:27:16 -08:00
|
|
|
v, err := code.Run()
|
2009-09-02 17:15:43 -07:00
|
|
|
if err != nil {
|
2009-12-15 15:27:16 -08:00
|
|
|
println(err.String())
|
|
|
|
|
continue
|
2009-09-02 17:15:43 -07:00
|
|
|
}
|
|
|
|
|
if v != nil {
|
2009-11-09 12:07:39 -08:00
|
|
|
println(v.String())
|
2009-09-02 17:15:43 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|