2018-10-09 10:37:56 +02:00
|
|
|
//
|
|
|
|
// 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)
|
|
|
|
}
|
|
|
|
|
2018-10-10 19:39:29 +02:00
|
|
|
var args []ell.V
|
2018-10-09 10:37:56 +02:00
|
|
|
for i := 2; i < len(os.Args); i++ {
|
2018-10-10 19:39:29 +02:00
|
|
|
args = append(args, *ell.NewString(os.Args[i]))
|
2018-10-09 10:37:56 +02:00
|
|
|
}
|
|
|
|
|
2018-10-10 19:39:29 +02:00
|
|
|
var result []ell.V
|
2018-10-09 10:37:56 +02:00
|
|
|
if !L.EvalBlock(program, args, &result) {
|
|
|
|
fmt.Printf("%s: %s\n", "runtime error", L.Error)
|
|
|
|
}
|
|
|
|
}
|