aboutsummaryrefslogtreecommitdiff
path: root/driver/parser_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'driver/parser_test.go')
-rw-r--r--driver/parser_test.go88
1 files changed, 65 insertions, 23 deletions
diff --git a/driver/parser_test.go b/driver/parser_test.go
index bc6a34e..17fee21 100644
--- a/driver/parser_test.go
+++ b/driver/parser_test.go
@@ -9,7 +9,12 @@ import (
)
func TestParser_Parse(t *testing.T) {
- specSrc := `
+ tests := []struct {
+ specSrc string
+ src string
+ }{
+ {
+ specSrc: `
expr
: expr "\+" term
| term
@@ -23,28 +28,65 @@ factor
| id
;
id: "[A-Za-z_][0-9A-Za-z_]*";
-`
- ast, err := spec.Parse(strings.NewReader(specSrc))
- if err != nil {
- t.Fatal(err)
- }
- g, err := grammar.NewGrammar(ast)
- if err != nil {
- t.Fatal(err)
- }
- gram, err := grammar.Compile(g)
- if err != nil {
- t.Fatal(err)
- }
- src := `(a+(b+c))*d+e`
- p, err := NewParser(gram, strings.NewReader(src))
- if err != nil {
- t.Fatal(err)
- }
- err = p.Parse()
- if err != nil {
- t.Fatal(err)
+`,
+ src: `(a+(b+c))*d+e`,
+ },
+ {
+ specSrc: `
+mode_tran_seq
+ : mode_tran_seq mode_tran
+ | mode_tran
+ ;
+mode_tran
+ : push_m1
+ | push_m2
+ | pop_m1
+ | pop_m2
+ ;
+push_m1: "->" # push m1;
+@mode m1
+push_m2: "-->" # push m2;
+@mode m1
+pop_m1 : "<-" # pop;
+@mode m2
+pop_m2: "<--" # pop;
+`,
+ src: `->--><--<-`,
+ },
+ {
+ specSrc: `
+s
+ : foo bar
+ ;
+foo: "foo";
+@mode default
+bar: "bar";
+`,
+ src: `foobar`,
+ },
}
+ for _, tt := range tests {
+ ast, err := spec.Parse(strings.NewReader(tt.specSrc))
+ if err != nil {
+ t.Fatal(err)
+ }
+ g, err := grammar.NewGrammar(ast)
+ if err != nil {
+ t.Fatal(err)
+ }
+ gram, err := grammar.Compile(g)
+ if err != nil {
+ t.Fatal(err)
+ }
+ p, err := NewParser(gram, strings.NewReader(tt.src))
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = p.Parse()
+ if err != nil {
+ t.Fatal(err)
+ }
- printCST(p.GetCST(), 0)
+ printCST(p.GetCST(), 0)
+ }
}