func run(source lexer.Source) { l := lexer.NewLexer(source) util.Timed("lexing", *debug, func() { util.ReportError(l.Lex(), false) }) p := parser.NewParser(l.Tokens) util.Timed("parsing", *debug, func() { util.ReportError(p.Parse(), false) }) if *ast { bytes, _ := json.MarshalIndent(p, "", " ") fmt.Println(string(bytes)) } else { b := apply(runtime.NewBlock(p.Nodes, runtime.NewScope(nil))) util.Timed("runtime", *debug, func() { _, err := b.Eval() if err != nil { util.ReportError(err, false) } }) } }
func main() { flag.Usage = usage flag.Parse() if len(flag.Args()) > 0 { var file *util.File util.Timed("file reading", *debug, func() { os.Chdir(filepath.Dir(flag.Arg(0))) f, err := util.NewFile(filepath.Base(flag.Arg(0))) if err != nil { util.ReportError(err, false) } file = f }) run(lexer.NewSourceFromFile(file)) } else if *runRepl { s := repl.NewReplSession(apply(runtime.NewBlock(nil, runtime.NewScope(nil)))) s.Run() } else { bytes, err := ioutil.ReadAll(os.Stdin) if err != nil { util.ReportError(err, false) } run(lexer.NewSourceFromString("<stdin>", string(bytes))) } }