diff options
Diffstat (limited to 'driver/parser_test.go')
-rw-r--r-- | driver/parser_test.go | 88 |
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) + } } |