aboutsummaryrefslogtreecommitdiff
path: root/spec/parser.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-07-18 01:24:34 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-07-18 01:24:34 +0900
commitaedba83693cf1437e0d3295a2f160e43ffcc55ea (patch)
tree3bd8b4f94c9b77f112ac2db3733139dc2ba3b971 /spec/parser.go
parentDetect multiple syntax errors in a single parse (diff)
downloadcotia-aedba83693cf1437e0d3295a2f160e43ffcc55ea.tar.gz
cotia-aedba83693cf1437e0d3295a2f160e43ffcc55ea.tar.xz
Refactor
Diffstat (limited to 'spec/parser.go')
-rw-r--r--spec/parser.go24
1 files changed, 19 insertions, 5 deletions
diff --git a/spec/parser.go b/spec/parser.go
index 8b825bf..e749d72 100644
--- a/spec/parser.go
+++ b/spec/parser.go
@@ -8,8 +8,9 @@ import (
)
type RootNode struct {
- Productions []*ProductionNode
- Fragments []*FragmentNode
+ Productions []*ProductionNode
+ LexProductions []*ProductionNode
+ Fragments []*FragmentNode
}
type ProductionNode struct {
@@ -18,6 +19,13 @@ type ProductionNode struct {
RHS []*AlternativeNode
}
+func (n *ProductionNode) isLexical() bool {
+ if len(n.RHS) == 1 && len(n.RHS[0].Elements) == 1 && n.RHS[0].Elements[0].Pattern != "" {
+ return true
+ }
+ return false
+}
+
type AlternativeNode struct {
Elements []*ElementNode
Directive *DirectiveNode
@@ -112,6 +120,7 @@ func (p *parser) parseRoot() *RootNode {
}()
var prods []*ProductionNode
+ var lexProds []*ProductionNode
var fragments []*FragmentNode
for {
fragment := p.parseFragment()
@@ -122,7 +131,11 @@ func (p *parser) parseRoot() *RootNode {
prod := p.parseProduction()
if prod != nil {
- prods = append(prods, prod)
+ if prod.isLexical() {
+ lexProds = append(lexProds, prod)
+ } else {
+ prods = append(prods, prod)
+ }
continue
}
@@ -132,8 +145,9 @@ func (p *parser) parseRoot() *RootNode {
}
return &RootNode{
- Productions: prods,
- Fragments: fragments,
+ Productions: prods,
+ LexProductions: lexProds,
+ Fragments: fragments,
}
}