diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-06-20 18:39:38 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-06-20 18:46:13 +0900 |
commit | 8993406a8ebe8c0a01d5081dc4afcf819e3160d4 (patch) | |
tree | 8940654c0bbc1e200908cafe83813fe7765a5229 /driver/parser_test.go | |
parent | Add syntax of comments (diff) | |
download | urubu-8993406a8ebe8c0a01d5081dc4afcf819e3160d4.tar.gz urubu-8993406a8ebe8c0a01d5081dc4afcf819e3160d4.tar.xz |
Add syntax of modifiers and actions
Currently, a mode modifier and push/pop actions are available.
The modifier and the actions make sense in only lexical specifications.
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) + } } |