diff options
author | Přemysl Janouch <p@janouch.name> | 2018-10-09 10:37:56 +0200 |
---|---|---|
committer | Přemysl Janouch <p@janouch.name> | 2018-10-09 10:42:20 +0200 |
commit | f751975cfd967c717473fea400d926a4c9f8beb1 (patch) | |
tree | a09b8095acdc5e535c345fbbc8a39248fc816168 /cmd/interpreter | |
parent | 55a107636733320f6ae84920a171799f102cefe1 (diff) | |
download | ell-f751975cfd967c717473fea400d926a4c9f8beb1.tar.gz ell-f751975cfd967c717473fea400d926a4c9f8beb1.tar.xz ell-f751975cfd967c717473fea400d926a4c9f8beb1.zip |
Add a port to Go
Diffstat (limited to 'cmd/interpreter')
-rw-r--r-- | cmd/interpreter/main.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/cmd/interpreter/main.go b/cmd/interpreter/main.go new file mode 100644 index 0000000..822aec8 --- /dev/null +++ b/cmd/interpreter/main.go @@ -0,0 +1,63 @@ +// +// Copyright (c) 2018, Přemysl Janouch <p@janouch.name> +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +// Program interpreter is a basic ell interpreter. +package main + +import ( + "fmt" + "io/ioutil" + "os" + + "janouch.name/ell/ell" +) + +func main() { + var script []byte + var err error + + if len(os.Args) < 2 { + script, err = ioutil.ReadAll(os.Stdin) + } else { + script, err = ioutil.ReadFile(os.Args[1]) + } + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + + L := ell.New() + if !ell.StdInitialize(L) { + fmt.Printf("runtime library initialization failed: %s\n", L.Error) + } + + program, err := ell.NewParser(script).Run() + if err != nil { + fmt.Printf("%s: %s\n", "parse error", err) + os.Exit(1) + } + + var args *ell.V + tail := &args + for i := 2; i < len(os.Args); i++ { + *tail = ell.NewString([]byte(os.Args[i])) + tail = &(*tail).Next + } + + var result *ell.V + if !L.EvalBlock(program, args, &result) { + fmt.Printf("%s: %s\n", "runtime error", L.Error) + } +} |