aboutsummaryrefslogtreecommitdiff
path: root/driver/parser_test.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2022-03-29 01:43:36 +0900
committerRyo Nihei <nihei.dev@gmail.com>2022-03-29 01:45:08 +0900
commit4d2a389c0ea605413d1cc89ae35f2a3aaa293072 (patch)
tree6b6a5fe98f2a27a38cdbc569706e43970fbc05e5 /driver/parser_test.go
parentAdd label notation (diff)
downloadurubu-4d2a389c0ea605413d1cc89ae35f2a3aaa293072.tar.gz
urubu-4d2a389c0ea605413d1cc89ae35f2a3aaa293072.tar.xz
Use IDs and labels as parameters of an #ast directive instead of symbol positions
Diffstat (limited to 'driver/parser_test.go')
-rw-r--r--driver/parser_test.go106
1 files changed, 102 insertions, 4 deletions
diff --git a/driver/parser_test.go b/driver/parser_test.go
index dfc2fe5..050e51a 100644
--- a/driver/parser_test.go
+++ b/driver/parser_test.go
@@ -322,10 +322,10 @@ fragment words: "[A-Za-z\u{0020}]+";
%name test
list
- : "\[" elems "]" #ast $2...
+ : "\[" elems "]" #ast elems...
;
elems
- : elems "," id #ast $1... $3
+ : elems "," id #ast elems... id
| id
;
whitespace: "\u{0020}+" #skip;
@@ -353,6 +353,39 @@ id: "[A-Za-z]+";
termNode("id", "Langly"),
),
},
+ // A label can be a parameter of #ast directive.
+ {
+ specSrc: `
+%name test
+
+%left add sub
+
+expr
+ : expr@lhs add expr@rhs #ast add lhs rhs
+ | expr@lhs sub expr@rhs #ast sub lhs rhs
+ | num
+ ;
+add: '+';
+sub: '-';
+num: "0|[1-9][0-9]*";
+`,
+ src: `1+2-3`,
+ ast: nonTermNode("expr",
+ termNode("sub", "-"),
+ nonTermNode("expr",
+ termNode("add", "+"),
+ nonTermNode("expr",
+ termNode("num", "1"),
+ ),
+ nonTermNode("expr",
+ termNode("num", "2"),
+ ),
+ ),
+ nonTermNode("expr",
+ termNode("num", "3"),
+ ),
+ ),
+ },
// An ast action cannot be applied to a terminal symbol.
{
specSrc: `
@@ -362,7 +395,7 @@ s
: foo
;
foo
- : "foo" #ast $1...
+ : "foo"@f #ast f...
;
`,
specErr: true,
@@ -373,12 +406,77 @@ foo
%name test
s
- : foo #ast $1...
+ : foo #ast foo...
;
foo: "foo";
`,
specErr: true,
},
+ // The expansion cannot be applied to a pattern.
+ {
+ specSrc: `
+%name test
+
+s
+ : foo "bar"@b #ast foo b...
+ ;
+foo: "foo";
+`,
+ specErr: true,
+ },
+ // The expansion cannot be applied to a string.
+ {
+ specSrc: `
+%name test
+
+s
+ : foo 'bar'@b #ast foo b...
+ ;
+foo: "foo";
+`,
+ specErr: true,
+ },
+ // A parameter of #ast directive must be either a symbol or a label in an alternative.
+ {
+ specSrc: `
+%name test
+
+s
+ : foo bar #ast foo x
+ ;
+foo: "foo";
+bar: "bar";
+`,
+ specErr: true,
+ },
+ // A symbol in a different alternative cannot be a parameter of #ast directive.
+ {
+ specSrc: `
+%name test
+
+s
+ : foo #ast bar
+ | bar
+ ;
+foo: "foo";
+bar: "bar";
+`,
+ specErr: true,
+ },
+ // A label in a different alternative cannot be a parameter of #ast directive.
+ {
+ specSrc: `
+%name test
+
+s
+ : foo #ast b
+ | bar@b
+ ;
+foo: "foo";
+bar: "bar";
+`,
+ specErr: true,
+ },
// A production must not have a duplicate alternative.
{
specSrc: `