Brian Picciano
4870455430
The new gg format is based on a BNF file which can be found in the `gg` directory. The code for decoding `.gg` files has been refactored to mirror that file. The result is more resilient parsing, better errors, and a greater ability to extend the format in the future. The new decoder is notable in that it does not use a lexer. Both lexing and parsing are done in a single step. The format syntax itself has also been modified. Rather than using semi-colons everywhere, commas are used as separators in tuples. Additionally the final comma/semi-colon is no longer required.
38 lines
626 B
Go
38 lines
626 B
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/mediocregopher/ginger/gg"
|
|
"github.com/mediocregopher/ginger/vm"
|
|
)
|
|
|
|
func main() {
|
|
|
|
if len(os.Args) < 3 {
|
|
fmt.Printf(`Usage: %s <operation source> "in = <value>"\n`, os.Args[0])
|
|
return
|
|
}
|
|
|
|
opSrc := os.Args[1]
|
|
inSrc := os.Args[2]
|
|
|
|
inVal, err := gg.NewDecoder(bytes.NewBufferString(inSrc)).Next()
|
|
if err != nil {
|
|
panic(fmt.Sprintf("decoding input: %v", err))
|
|
}
|
|
|
|
res, err := vm.EvaluateSource(
|
|
bytes.NewBufferString(opSrc),
|
|
vm.Value{Value: inVal},
|
|
vm.GlobalScope,
|
|
)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("evaluating: %v", err))
|
|
}
|
|
|
|
fmt.Println(res)
|
|
}
|