From 37b9da32d3b911091deb254f6cba2a137c471287 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Thu, 12 Oct 2023 10:51:58 +0200 Subject: move to a direct byte code compiler (#8) * chore: refactor to keep only the new parser and bytecode vm * scanner: remove Token.value field * scanner: remove scanner.kind field * chore: move language specification in lang package This avoid a cyclic dependency in scanner_test which can now use the golang/GoSpec language specification for Go. * clean code * scanner: export scanner fields Also parser now generate function calls, including externals. * chore: fix lint issues * parser: handle strings * wip * parser: implement support for 'if, else, else if' statements Resolving labels in the compiler still in progress. * parser: support if statements, improve compiler * improve handling of functions * improve support of local variables * scanner: trim leading and trailing spaces * fixes to make fibonacci work * parser: improve README, fix function parameters parsing --- main.go | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 4ae57da..6994038 100644 --- a/main.go +++ b/main.go @@ -9,10 +9,9 @@ import ( "log" "os" - "github.com/gnolang/parscan/codegen" "github.com/gnolang/parscan/lang/golang" + "github.com/gnolang/parscan/parser" "github.com/gnolang/parscan/scanner" - "github.com/gnolang/parscan/vm0" ) type Interpreter interface { @@ -61,32 +60,20 @@ func repl(interp Interpreter, in io.Reader) (err error) { } func run(arg []string) (err error) { - var i int - rflag := flag.NewFlagSet("run", flag.ContinueOnError) - rflag.IntVar(&i, "i", 1, "set interpreter version for execution, possible values: 0, 1") rflag.Usage = func() { fmt.Println("Usage: parscan run [options] [path] [args]") - fmt.Println("Options:") - rflag.PrintDefaults() + //fmt.Println("Options:") + //rflag.PrintDefaults() } if err = rflag.Parse(arg); err != nil { return err } args := rflag.Args() - var interp Interpreter - switch i { - case 0: - interp = vm0.New(golang.GoParser) - case 1: - interp = codegen.NewInterpreter(golang.GoParser) - interp.(*codegen.Interpreter).AddSym(fmt.Println, "println") - default: - return fmt.Errorf("invalid interpreter version: %v", i) - } + interp := parser.NewInterpreter(scanner.NewScanner(golang.GoSpec)) + interp.AddSym("println", fmt.Println) - log.Println("args:", args) in := os.Stdin if len(args) > 0 { if in, err = os.Open(arg[0]); err != nil { -- cgit v1.2.3