diff options
| author | Marc Vertes <marc.vertes@tendermint.com> | 2023-10-12 10:51:58 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-12 10:51:58 +0200 |
| commit | 37b9da32d3b911091deb254f6cba2a137c471287 (patch) | |
| tree | b4451de0fa0473a937a77d39fd1f8a4f87c8f60d /main.go | |
| parent | a21b9b12ad865a19ff687645082f9093c4101039 (diff) | |
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
Diffstat (limited to 'main.go')
| -rw-r--r-- | main.go | 23 |
1 files changed, 5 insertions, 18 deletions
@@ -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 { |
