aboutsummaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec/grammar/description.go1
-rw-r--r--spec/grammar/parser.go2
-rw-r--r--spec/grammar/parser_test.go132
-rw-r--r--spec/test/parser.go6
-rw-r--r--spec/test/tree-report.json2
-rw-r--r--spec/test/tree_semantic_action.go6
6 files changed, 95 insertions, 54 deletions
diff --git a/spec/grammar/description.go b/spec/grammar/description.go
index 68b16be..0d2a0b7 100644
--- a/spec/grammar/description.go
+++ b/spec/grammar/description.go
@@ -3,7 +3,6 @@ package grammar
type Terminal struct {
Number int `json:"number"`
Name string `json:"name"`
- Anonymous bool `json:"anonymous"`
Pattern string `json:"pattern"`
Precedence int `json:"prec"`
Associativity string `json:"assoc"`
diff --git a/spec/grammar/parser.go b/spec/grammar/parser.go
index 946d877..27a7c7d 100644
--- a/spec/grammar/parser.go
+++ b/spec/grammar/parser.go
@@ -351,7 +351,7 @@ func (p *parser) parseProduction() *ProductionNode {
if !prod.isLexical() {
for _, alt := range prod.RHS {
for _, elem := range alt.Elements {
- if elem.Pattern != "" && !elem.Literally {
+ if elem.Pattern != "" {
raiseSyntaxError(elem.Pos.Row, synErrPatternInAlt)
}
}
diff --git a/spec/grammar/parser_test.go b/spec/grammar/parser_test.go
index 4fd7e9f..5a2e07f 100644
--- a/spec/grammar/parser_test.go
+++ b/spec/grammar/parser_test.go
@@ -272,56 +272,102 @@ func TestParse(t *testing.T) {
{
caption: "multiple productions are a valid grammar",
src: `
-e: e '+' t | e '-' t | t;
-t: t '*' f | t '/' f | f;
-f: '(' e ')' | id;
-id: "[A-Za-z_][0-9A-Za-z_]*";
+e
+ : e add t
+ | e sub t
+ | t
+ ;
+t
+ : t mul f
+ | t div f
+ | f
+ ;
+f
+ : l_paren e r_paren
+ | id
+ ;
+
+add
+ : '+';
+sub
+ : '-';
+mul
+ : '*';
+div
+ : '/';
+l_paren
+ : '(';
+r_paren
+ : ')';
+id
+ : "[A-Za-z_][0-9A-Za-z_]*";
`,
ast: &RootNode{
Productions: []*ProductionNode{
prod("e",
- alt(id("e"), pat(`+`), id("t")),
- alt(id("e"), pat(`-`), id("t")),
+ alt(id("e"), id("add"), id("t")),
+ alt(id("e"), id("sub"), id("t")),
alt(id("t")),
),
prod("t",
- alt(id("t"), pat(`*`), id("f")),
- alt(id("t"), pat(`/`), id("f")),
+ alt(id("t"), id("mul"), id("f")),
+ alt(id("t"), id("div"), id("f")),
alt(id("f")),
),
prod("f",
- alt(pat(`(`), id("e"), pat(`)`)),
+ alt(id("l_paren"), id("e"), id("r_paren")),
alt(id("id")),
),
},
LexProductions: []*ProductionNode{
- prod("id",
- alt(pat(`[A-Za-z_][0-9A-Za-z_]*`)),
- ),
+ prod("add", alt(pat(`+`))),
+ prod("sub", alt(pat(`-`))),
+ prod("mul", alt(pat(`*`))),
+ prod("div", alt(pat(`/`))),
+ prod("l_paren", alt(pat(`(`))),
+ prod("r_paren", alt(pat(`)`))),
+ prod("id", alt(pat(`[A-Za-z_][0-9A-Za-z_]*`))),
},
},
},
{
caption: "productions can contain the empty alternative",
src: `
-a: 'foo' | ;
-b: | 'bar';
-c: ;
+a
+ : foo
+ |
+ ;
+b
+ :
+ | bar
+ ;
+c
+ :
+ ;
+
+foo
+ : 'foo';
+bar
+ : 'bar';
`,
ast: &RootNode{
Productions: []*ProductionNode{
prod("a",
- alt(pat(`foo`)),
+ alt(id("foo")),
alt(),
),
prod("b",
alt(),
- alt(pat(`bar`)),
+ alt(id("bar")),
),
prod("c",
alt(),
),
},
+ LexProductions: []*ProductionNode{
+ prod("foo", alt(pat(`foo`))),
+ prod("bar", alt(pat(`bar`))),
+ },
},
},
{
@@ -332,35 +378,23 @@ a: $x;
synErr: synErrNoSemicolon,
},
{
- caption: "an alternative can contain a string literal without a terminal symbol",
+ caption: "an alternative cannot contain a pattern directly",
src: `
s
- : 'foo' bar
+ : "foo" bar
;
bar
- : 'bar';
+ : "bar";
`,
- ast: &RootNode{
- Productions: []*ProductionNode{
- prod("s",
- alt(pat(`foo`), id("bar")),
- ),
- },
- LexProductions: []*ProductionNode{
- prod("bar",
- alt(pat(`bar`)),
- ),
- },
- },
+ synErr: synErrPatternInAlt,
},
{
- caption: "an alternative cannot contain a pattern directly",
+ caption: "an alternative cannot contain a string directly",
src: `
s
- : "foo" bar
+ : 'foo' bar
;
-
bar
: "bar";
`,
@@ -721,12 +755,14 @@ a
caption: "an AST has node positions",
src: `
exp
- : exp '+' id #ast exp id
+ : exp add id #ast exp id
| id
;
whitespace #skip
: "\u{0020}+";
+add
+ : '+';
id
: "\f{letter}(\f{letter}|\f{number})*";
fragment letter
@@ -743,7 +779,7 @@ fragment number
withAltDir(
alt(
withElemPos(id("exp"), newPos(3)),
- withElemPos(pat(`+`), newPos(3)),
+ withElemPos(id("add"), newPos(3)),
withElemPos(id("id"), newPos(3)),
),
withDirPos(
@@ -788,11 +824,11 @@ fragment number
newPos(7),
),
withProdPos(
- prod("id",
+ prod("add",
withAltPos(
alt(
withElemPos(
- pat(`\f{letter}(\f{letter}|\f{number})*`),
+ pat(`+`),
newPos(10),
),
),
@@ -801,15 +837,29 @@ fragment number
),
newPos(9),
),
+ withProdPos(
+ prod("id",
+ withAltPos(
+ alt(
+ withElemPos(
+ pat(`\f{letter}(\f{letter}|\f{number})*`),
+ newPos(12),
+ ),
+ ),
+ newPos(12),
+ ),
+ ),
+ newPos(11),
+ ),
},
Fragments: []*FragmentNode{
withFragmentPos(
frag("letter", "[A-Za-z_]"),
- newPos(11),
+ newPos(13),
),
withFragmentPos(
frag("number", "[0-9]"),
- newPos(13),
+ newPos(15),
),
},
},
diff --git a/spec/test/parser.go b/spec/test/parser.go
index c30d45c..b7265d7 100644
--- a/spec/test/parser.go
+++ b/spec/test/parser.go
@@ -78,11 +78,7 @@ func (t *Tree) format(buf *bytes.Buffer, depth int) {
buf.WriteString(" ")
}
buf.WriteString("(")
- if t.Kind == "" {
- buf.WriteString("<anonymous>")
- } else {
- buf.WriteString(t.Kind)
- }
+ buf.WriteString(t.Kind)
if len(t.Children) > 0 {
buf.WriteString("\n")
for i, c := range t.Children {
diff --git a/spec/test/tree-report.json b/spec/test/tree-report.json
index 3bfba2c..c2018e5 100644
--- a/spec/test/tree-report.json
+++ b/spec/test/tree-report.json
@@ -1 +1 @@
-{"terminals":[null,{"number":1,"name":"\u003ceof\u003e","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":2,"name":"error","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":3,"name":"ws","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":4,"name":"l_paren","anonymous":false,"pattern":"","prec":1,"assoc":""},{"number":5,"name":"r_paren","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":6,"name":"identifier","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":7,"name":"raw_string_open","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":8,"name":"raw_string_body","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":9,"name":"raw_string_close","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":10,"name":"interpreted_string_open","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":11,"name":"interpreted_seq","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":12,"name":"codepoint_prefix","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":13,"name":"l_brace","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":14,"name":"r_brace","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":15,"name":"hex_digits","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":16,"name":"escaped_seq","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":17,"name":"escape_char","anonymous":false,"pattern":"","prec":0,"assoc":""},{"number":18,"name":"interpreted_string_close","anonymous":false,"pattern":"","prec":0,"assoc":""}],"non_terminals":[null,{"number":1,"name":"tree'"},{"number":2,"name":"tree"},{"number":3,"name":"tree_list"},{"number":4,"name":"string"},{"number":5,"name":"raw_string"},{"number":6,"name":"opt_raw_string_body"},{"number":7,"name":"interpreted_string"},{"number":8,"name":"opt_interpreted_string_body"},{"number":9,"name":"interpreted_string_body"},{"number":10,"name":"interpreted_string_elem"},{"number":11,"name":"codepoint_expr"}],"productions":[null,{"number":1,"lhs":1,"rhs":[-2],"prec":0,"assoc":""},{"number":2,"lhs":2,"rhs":[4,6,-3,5],"prec":0,"assoc":""},{"number":3,"lhs":2,"rhs":[4,6,-4,5],"prec":0,"assoc":""},{"number":4,"lhs":2,"rhs":[4,2,5],"prec":0,"assoc":""},{"number":5,"lhs":3,"rhs":[-3,-2],"prec":0,"assoc":""},{"number":6,"lhs":3,"rhs":[-2],"prec":0,"assoc":""},{"number":7,"lhs":3,"rhs":[],"prec":2,"assoc":""},{"number":8,"lhs":4,"rhs":[-5],"prec":0,"assoc":""},{"number":9,"lhs":4,"rhs":[-7],"prec":0,"assoc":""},{"number":10,"lhs":5,"rhs":[7,-6,9],"prec":0,"assoc":""},{"number":11,"lhs":6,"rhs":[8],"prec":0,"assoc":""},{"number":12,"lhs":6,"rhs":[],"prec":0,"assoc":""},{"number":13,"lhs":7,"rhs":[10,-8,18],"prec":0,"assoc":""},{"number":14,"lhs":7,"rhs":[10,2,18],"prec":0,"assoc":""},{"number":15,"lhs":8,"rhs":[-9],"prec":0,"assoc":""},{"number":16,"lhs":8,"rhs":[],"prec":0,"assoc":""},{"number":17,"lhs":9,"rhs":[-9,-10],"prec":0,"assoc":""},{"number":18,"lhs":9,"rhs":[-10],"prec":0,"assoc":""},{"number":19,"lhs":10,"rhs":[11],"prec":0,"assoc":""},{"number":20,"lhs":10,"rhs":[13],"prec":0,"assoc":""},{"number":21,"lhs":10,"rhs":[14],"prec":0,"assoc":""},{"number":22,"lhs":10,"rhs":[15],"prec":0,"assoc":""},{"number":23,"lhs":10,"rhs":[16],"prec":0,"assoc":""},{"number":24,"lhs":10,"rhs":[17],"prec":0,"assoc":""},{"number":25,"lhs":10,"rhs":[-11],"prec":0,"assoc":""},{"number":26,"lhs":11,"rhs":[12,13,15,14],"prec":0,"assoc":""}],"states":[{"number":0,"kernel":[{"production":1,"dot":0}],"shift":[{"symbol":4,"state":2}],"reduce":null,"goto":[{"symbol":2,"state":1}],"sr_conflict":[],"rr_conflict":[]},{"number":1,"kernel":[{"production":1,"dot":1}],"shift":null,"reduce":[{"look_ahead":[1],"production":1}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":2,"kernel":[{"production":2,"dot":1},{"production":3,"dot":1},{"production":4,"dot":1}],"shift":[{"symbol":2,"state":3},{"symbol":6,"state":4}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":3,"kernel":[{"production":4,"dot":2}],"shift":[{"symbol":5,"state":5}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":4,"kernel":[{"production":2,"dot":2},{"production":3,"dot":2}],"shift":[{"symbol":4,"state":2},{"symbol":7,"state":11},{"symbol":10,"state":12}],"reduce":[{"look_ahead":[5,1],"production":7}],"goto":[{"symbol":2,"state":6},{"symbol":3,"state":7},{"symbol":4,"state":8},{"symbol":5,"state":9},{"symbol":7,"state":10}],"sr_conflict":[{"symbol":4,"state":2,"production":7,"adopted_state":2,"adopted_production":null,"resolved_by":1}],"rr_conflict":[]},{"number":5,"kernel":[{"production":4,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":4}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":6,"kernel":[{"production":6,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5],"production":6}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":7,"kernel":[{"production":2,"dot":3},{"production":5,"dot":1}],"shift":[{"symbol":4,"state":2},{"symbol":5,"state":14}],"reduce":null,"goto":[{"symbol":2,"state":13}],"sr_conflict":[],"rr_conflict":[]},{"number":8,"kernel":[{"production":3,"dot":3}],"shift":[{"symbol":5,"state":15}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":9,"kernel":[{"production":8,"dot":1}],"shift":null,"reduce":[{"look_ahead":[5],"production":8}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":10,"kernel":[{"production":9,"dot":1}],"shift":null,"reduce":[{"look_ahead":[5],"production":9}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":11,"kernel":[{"production":10,"dot":1}],"shift":[{"symbol":8,"state":17}],"reduce":[{"look_ahead":[4,5,9,1],"production":12}],"goto":[{"symbol":6,"state":16}],"sr_conflict":[],"rr_conflict":[]},{"number":12,"kernel":[{"production":13,"dot":1},{"production":14,"dot":1}],"shift":[{"symbol":2,"state":22},{"symbol":11,"state":23},{"symbol":12,"state":24},{"symbol":13,"state":25},{"symbol":14,"state":26},{"symbol":15,"state":27},{"symbol":16,"state":28},{"symbol":17,"state":29}],"reduce":[{"look_ahead":[4,5,18,1],"production":16}],"goto":[{"symbol":8,"state":18},{"symbol":9,"state":19},{"symbol":10,"state":20},{"symbol":11,"state":21}],"sr_conflict":[],"rr_conflict":[]},{"number":13,"kernel":[{"production":5,"dot":2}],"shift":null,"reduce":[{"look_ahead":[4,5],"production":5}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":14,"kernel":[{"production":2,"dot":4}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":2}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":15,"kernel":[{"production":3,"dot":4}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":3}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":16,"kernel":[{"production":10,"dot":2}],"shift":[{"symbol":9,"state":30}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":17,"kernel":[{"production":11,"dot":1}],"shift":null,"reduce":[{"look_ahead":[9],"production":11}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":18,"kernel":[{"production":13,"dot":2}],"shift":[{"symbol":18,"state":31}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":19,"kernel":[{"production":15,"dot":1},{"production":17,"dot":1}],"shift":[{"symbol":11,"state":23},{"symbol":12,"state":24},{"symbol":13,"state":25},{"symbol":14,"state":26},{"symbol":15,"state":27},{"symbol":16,"state":28},{"symbol":17,"state":29}],"reduce":[{"look_ahead":[18],"production":15}],"goto":[{"symbol":11,"state":21},{"symbol":10,"state":32}],"sr_conflict":[],"rr_conflict":[]},{"number":20,"kernel":[{"production":18,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":18}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":21,"kernel":[{"production":25,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":25}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":22,"kernel":[{"production":14,"dot":2}],"shift":[{"symbol":18,"state":33}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":23,"kernel":[{"production":19,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":19}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":24,"kernel":[{"production":26,"dot":1}],"shift":[{"symbol":13,"state":34}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":25,"kernel":[{"production":20,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":20}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":26,"kernel":[{"production":21,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":21}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":27,"kernel":[{"production":22,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":22}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":28,"kernel":[{"production":23,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":23}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":29,"kernel":[{"production":24,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":24}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":30,"kernel":[{"production":10,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":10}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":31,"kernel":[{"production":13,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":13}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":32,"kernel":[{"production":17,"dot":2}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":17}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":33,"kernel":[{"production":14,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":14}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":34,"kernel":[{"production":26,"dot":2}],"shift":[{"symbol":15,"state":35}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":35,"kernel":[{"production":26,"dot":3}],"shift":[{"symbol":14,"state":36}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":36,"kernel":[{"production":26,"dot":4}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":26}],"goto":null,"sr_conflict":[],"rr_conflict":[]}]}
+{"terminals":[null,{"number":1,"name":"\u003ceof\u003e","pattern":"","prec":0,"assoc":""},{"number":2,"name":"error","pattern":"","prec":0,"assoc":""},{"number":3,"name":"ws","pattern":"","prec":0,"assoc":""},{"number":4,"name":"l_paren","pattern":"","prec":1,"assoc":""},{"number":5,"name":"r_paren","pattern":"","prec":0,"assoc":""},{"number":6,"name":"identifier","pattern":"","prec":0,"assoc":""},{"number":7,"name":"raw_string_open","pattern":"","prec":0,"assoc":""},{"number":8,"name":"raw_string_body","pattern":"","prec":0,"assoc":""},{"number":9,"name":"raw_string_close","pattern":"","prec":0,"assoc":""},{"number":10,"name":"interpreted_string_open","pattern":"","prec":0,"assoc":""},{"number":11,"name":"interpreted_seq","pattern":"","prec":0,"assoc":""},{"number":12,"name":"codepoint_prefix","pattern":"","prec":0,"assoc":""},{"number":13,"name":"l_brace","pattern":"","prec":0,"assoc":""},{"number":14,"name":"r_brace","pattern":"","prec":0,"assoc":""},{"number":15,"name":"hex_digits","pattern":"","prec":0,"assoc":""},{"number":16,"name":"escaped_seq","pattern":"","prec":0,"assoc":""},{"number":17,"name":"escape_char","pattern":"","prec":0,"assoc":""},{"number":18,"name":"interpreted_string_close","pattern":"","prec":0,"assoc":""}],"non_terminals":[null,{"number":1,"name":"tree'"},{"number":2,"name":"tree"},{"number":3,"name":"tree_list"},{"number":4,"name":"string"},{"number":5,"name":"raw_string"},{"number":6,"name":"opt_raw_string_body"},{"number":7,"name":"interpreted_string"},{"number":8,"name":"opt_interpreted_string_body"},{"number":9,"name":"interpreted_string_body"},{"number":10,"name":"interpreted_string_elem"},{"number":11,"name":"codepoint_expr"}],"productions":[null,{"number":1,"lhs":1,"rhs":[-2],"prec":0,"assoc":""},{"number":2,"lhs":2,"rhs":[4,6,-3,5],"prec":0,"assoc":""},{"number":3,"lhs":2,"rhs":[4,6,-4,5],"prec":0,"assoc":""},{"number":4,"lhs":2,"rhs":[4,2,5],"prec":0,"assoc":""},{"number":5,"lhs":3,"rhs":[-3,-2],"prec":0,"assoc":""},{"number":6,"lhs":3,"rhs":[-2],"prec":0,"assoc":""},{"number":7,"lhs":3,"rhs":[],"prec":2,"assoc":""},{"number":8,"lhs":4,"rhs":[-5],"prec":0,"assoc":""},{"number":9,"lhs":4,"rhs":[-7],"prec":0,"assoc":""},{"number":10,"lhs":5,"rhs":[7,-6,9],"prec":0,"assoc":""},{"number":11,"lhs":6,"rhs":[8],"prec":0,"assoc":""},{"number":12,"lhs":6,"rhs":[],"prec":0,"assoc":""},{"number":13,"lhs":7,"rhs":[10,-8,18],"prec":0,"assoc":""},{"number":14,"lhs":7,"rhs":[10,2,18],"prec":0,"assoc":""},{"number":15,"lhs":8,"rhs":[-9],"prec":0,"assoc":""},{"number":16,"lhs":8,"rhs":[],"prec":0,"assoc":""},{"number":17,"lhs":9,"rhs":[-9,-10],"prec":0,"assoc":""},{"number":18,"lhs":9,"rhs":[-10],"prec":0,"assoc":""},{"number":19,"lhs":10,"rhs":[11],"prec":0,"assoc":""},{"number":20,"lhs":10,"rhs":[13],"prec":0,"assoc":""},{"number":21,"lhs":10,"rhs":[14],"prec":0,"assoc":""},{"number":22,"lhs":10,"rhs":[15],"prec":0,"assoc":""},{"number":23,"lhs":10,"rhs":[16],"prec":0,"assoc":""},{"number":24,"lhs":10,"rhs":[17],"prec":0,"assoc":""},{"number":25,"lhs":10,"rhs":[-11],"prec":0,"assoc":""},{"number":26,"lhs":11,"rhs":[12,13,15,14],"prec":0,"assoc":""}],"states":[{"number":0,"kernel":[{"production":1,"dot":0}],"shift":[{"symbol":4,"state":2}],"reduce":null,"goto":[{"symbol":2,"state":1}],"sr_conflict":[],"rr_conflict":[]},{"number":1,"kernel":[{"production":1,"dot":1}],"shift":null,"reduce":[{"look_ahead":[1],"production":1}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":2,"kernel":[{"production":2,"dot":1},{"production":3,"dot":1},{"production":4,"dot":1}],"shift":[{"symbol":2,"state":3},{"symbol":6,"state":4}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":3,"kernel":[{"production":4,"dot":2}],"shift":[{"symbol":5,"state":5}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":4,"kernel":[{"production":2,"dot":2},{"production":3,"dot":2}],"shift":[{"symbol":4,"state":2},{"symbol":7,"state":11},{"symbol":10,"state":12}],"reduce":[{"look_ahead":[5,1],"production":7}],"goto":[{"symbol":2,"state":6},{"symbol":3,"state":7},{"symbol":4,"state":8},{"symbol":5,"state":9},{"symbol":7,"state":10}],"sr_conflict":[{"symbol":4,"state":2,"production":7,"adopted_state":2,"adopted_production":null,"resolved_by":1}],"rr_conflict":[]},{"number":5,"kernel":[{"production":4,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":4}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":6,"kernel":[{"production":6,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5],"production":6}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":7,"kernel":[{"production":2,"dot":3},{"production":5,"dot":1}],"shift":[{"symbol":4,"state":2},{"symbol":5,"state":14}],"reduce":null,"goto":[{"symbol":2,"state":13}],"sr_conflict":[],"rr_conflict":[]},{"number":8,"kernel":[{"production":3,"dot":3}],"shift":[{"symbol":5,"state":15}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":9,"kernel":[{"production":8,"dot":1}],"shift":null,"reduce":[{"look_ahead":[5],"production":8}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":10,"kernel":[{"production":9,"dot":1}],"shift":null,"reduce":[{"look_ahead":[5],"production":9}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":11,"kernel":[{"production":10,"dot":1}],"shift":[{"symbol":8,"state":17}],"reduce":[{"look_ahead":[4,5,9,1],"production":12}],"goto":[{"symbol":6,"state":16}],"sr_conflict":[],"rr_conflict":[]},{"number":12,"kernel":[{"production":13,"dot":1},{"production":14,"dot":1}],"shift":[{"symbol":2,"state":22},{"symbol":11,"state":23},{"symbol":12,"state":24},{"symbol":13,"state":25},{"symbol":14,"state":26},{"symbol":15,"state":27},{"symbol":16,"state":28},{"symbol":17,"state":29}],"reduce":[{"look_ahead":[4,5,18,1],"production":16}],"goto":[{"symbol":8,"state":18},{"symbol":9,"state":19},{"symbol":10,"state":20},{"symbol":11,"state":21}],"sr_conflict":[],"rr_conflict":[]},{"number":13,"kernel":[{"production":5,"dot":2}],"shift":null,"reduce":[{"look_ahead":[4,5],"production":5}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":14,"kernel":[{"production":2,"dot":4}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":2}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":15,"kernel":[{"production":3,"dot":4}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":3}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":16,"kernel":[{"production":10,"dot":2}],"shift":[{"symbol":9,"state":30}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":17,"kernel":[{"production":11,"dot":1}],"shift":null,"reduce":[{"look_ahead":[9],"production":11}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":18,"kernel":[{"production":13,"dot":2}],"shift":[{"symbol":18,"state":31}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":19,"kernel":[{"production":15,"dot":1},{"production":17,"dot":1}],"shift":[{"symbol":11,"state":23},{"symbol":12,"state":24},{"symbol":13,"state":25},{"symbol":14,"state":26},{"symbol":15,"state":27},{"symbol":16,"state":28},{"symbol":17,"state":29}],"reduce":[{"look_ahead":[18],"production":15}],"goto":[{"symbol":11,"state":21},{"symbol":10,"state":32}],"sr_conflict":[],"rr_conflict":[]},{"number":20,"kernel":[{"production":18,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":18}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":21,"kernel":[{"production":25,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":25}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":22,"kernel":[{"production":14,"dot":2}],"shift":[{"symbol":18,"state":33}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":23,"kernel":[{"production":19,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":19}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":24,"kernel":[{"production":26,"dot":1}],"shift":[{"symbol":13,"state":34}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":25,"kernel":[{"production":20,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":20}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":26,"kernel":[{"production":21,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":21}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":27,"kernel":[{"production":22,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":22}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":28,"kernel":[{"production":23,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":23}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":29,"kernel":[{"production":24,"dot":1}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":24}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":30,"kernel":[{"production":10,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":10}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":31,"kernel":[{"production":13,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":13}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":32,"kernel":[{"production":17,"dot":2}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":17}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":33,"kernel":[{"production":14,"dot":3}],"shift":null,"reduce":[{"look_ahead":[4,5,1],"production":14}],"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":34,"kernel":[{"production":26,"dot":2}],"shift":[{"symbol":15,"state":35}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":35,"kernel":[{"production":26,"dot":3}],"shift":[{"symbol":14,"state":36}],"reduce":null,"goto":null,"sr_conflict":[],"rr_conflict":[]},{"number":36,"kernel":[{"production":26,"dot":4}],"shift":null,"reduce":[{"look_ahead":[4,5,11,12,13,14,15,16,17,18,1],"production":26}],"goto":null,"sr_conflict":[],"rr_conflict":[]}]}
diff --git a/spec/test/tree_semantic_action.go b/spec/test/tree_semantic_action.go
index c426183..c1d5a25 100644
--- a/spec/test/tree_semantic_action.go
+++ b/spec/test/tree_semantic_action.go
@@ -341,11 +341,7 @@ func printTree(w io.Writer, node *Node, ruledLine string, childRuledLinePrefix s
case NodeTypeError:
fmt.Fprintf(w, "%v%v\n", ruledLine, node.KindName)
case NodeTypeTerminal:
- if node.KindName == "" {
- fmt.Fprintf(w, "%v<anonymous> %v\n", ruledLine, strconv.Quote(node.Text))
- } else {
- fmt.Fprintf(w, "%v%v %v\n", ruledLine, node.KindName, strconv.Quote(node.Text))
- }
+ fmt.Fprintf(w, "%v%v %v\n", ruledLine, node.KindName, strconv.Quote(node.Text))
case NodeTypeNonTerminal:
fmt.Fprintf(w, "%v%v\n", ruledLine, node.KindName)