commit 4dea3b2e446b0a0628a452a4a69552cb28c841b3
parent 620e9910e6807c8bf8ab9fcf0a9a982f7cf491c9
Author: bsandro <email@bsandro.tech>
Date: Fri, 1 Jul 2022 01:05:57 +0300
support for running script files from command line
Diffstat:
3 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/main.go b/main.go
@@ -12,6 +12,17 @@ func main() {
if err != nil {
panic(err)
}
- fmt.Printf("ehlo %s, this is a potato interpretator cleverly named 'interp'\n", user.Username)
- repl.Start(os.Stdin, os.Stdout)
+
+ if len(os.Args) > 1 {
+ fname := os.Args[1]
+ script, err := os.ReadFile(fname)
+ if err != nil {
+ fmt.Printf("error opening file %s: %s\n", fname, err.Error())
+ return
+ }
+ repl.Run(string(script), os.Stdout)
+ } else {
+ fmt.Printf("ehlo %s, this is a potato interpretator cleverly named 'interp'\n", user.Username)
+ repl.Start(os.Stdin, os.Stdout)
+ }
}
diff --git a/repl/repl.go b/repl/repl.go
@@ -5,8 +5,8 @@ import (
"fmt"
"interp/eval"
"interp/lexer"
- "interp/parser"
"interp/object"
+ "interp/parser"
"io"
)
@@ -42,3 +42,15 @@ func printParserErrors(out io.Writer, errors []string) {
io.WriteString(out, "\t"+msg+"\n")
}
}
+
+func Run(script string, out io.Writer) {
+ ctx := object.NewContext()
+ l := lexer.New(script)
+ p := parser.New(l)
+ prg := p.ParseProgram()
+ if len(p.Errors()) == 0 {
+ eval.Eval(prg, ctx)
+ } else {
+ printParserErrors(out, p.Errors())
+ }
+}
diff --git a/test.in b/test.in
@@ -1,6 +1,14 @@
-let myhash = {"value1": 1,"value2": "two"};
+let myhash = {
+ "value1": 1,
+ "value2": "two",
+ "value3": "three"
+};
let one = "value";
let two = "2";
-puts(one, two, myhash[one+two]);
+let myfunc = fn(h) {
+ puts(h[one+two]);
+};
+
+myfunc(myhash);