diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-06-20 23:47:29 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-06-20 23:47:29 +0900 |
commit | 8ab850528e1c05f36668f36db6af4cdcb647180e (patch) | |
tree | cf1e373ebd76c6ad78d65c79351b2198c7e42b2a /spec/parser_test.go | |
parent | Add skip action (diff) | |
download | cotia-8ab850528e1c05f36668f36db6af4cdcb647180e.tar.gz cotia-8ab850528e1c05f36668f36db6af4cdcb647180e.tar.xz |
Add syntax of fragment
Diffstat (limited to 'spec/parser_test.go')
-rw-r--r-- | spec/parser_test.go | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/spec/parser_test.go b/spec/parser_test.go index 2060079..bacd2cb 100644 --- a/spec/parser_test.go +++ b/spec/parser_test.go @@ -47,6 +47,12 @@ func TestParse(t *testing.T) { Pattern: p, } } + fragment := func(lhs string, rhs string) *FragmentNode { + return &FragmentNode{ + LHS: lhs, + RHS: rhs, + } + } tests := []struct { caption string @@ -145,6 +151,29 @@ c: ; synErr: synErrNoProductionName, }, { + caption: "a grammar can contain fragments", + src: ` +s + : tagline + ; +tagline: "\f{words} IS OUT THERE."; +fragment words: "[A-Za-z\u{0020}]+"; +`, + ast: &RootNode{ + Productions: []*ProductionNode{ + production("s", + alternative(id("tagline")), + ), + production("tagline", + alternative(pattern(`\f{words} IS OUT THERE.`)), + ), + }, + Fragments: []*FragmentNode{ + fragment("words", `[A-Za-z\u{0020}]+`), + }, + }, + }, + { caption: "a grammar can contain production modifiers and semantic actions", src: ` mode_tran_seq |