From 8993406a8ebe8c0a01d5081dc4afcf819e3160d4 Mon Sep 17 00:00:00 2001 From: Ryo Nihei Date: Sun, 20 Jun 2021 18:39:38 +0900 Subject: 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. --- driver/parser_test.go | 88 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 23 deletions(-) (limited to 'driver/parser_test.go') 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) + } } -- cgit v1.2.3