use numeric ids during init

This commit is contained in:
Arpad Ryszka 2017-07-15 22:12:01 +02:00
parent 94a21ae755
commit 50592ed83f
5 changed files with 24 additions and 18 deletions

View File

@ -30,8 +30,8 @@ func (p *charParser) nodeName() string { return p.name }
func (p *charParser) nodeID() int { return p.id } func (p *charParser) nodeID() int { return p.id }
func (p *charParser) setID(id int) { p.id = p.id } func (p *charParser) setID(id int) { p.id = p.id }
func (p *charParser) parser(r *registry, parsers []string) (parser, error) { func (p *charParser) parser(r *registry, parsers *idSet) (parser, error) {
if stringsContainDeprecated(parsers, p.name) { if parsers.has(p.id) {
panic(cannotIncludeParsers(p.name)) panic(cannotIncludeParsers(p.name))
} }
@ -47,8 +47,8 @@ func (p *charParser) commitType() CommitType {
return p.commit return p.commit
} }
func (p *charParser) setIncludedBy(includedBy parser, parsers []string) { func (p *charParser) setIncludedBy(includedBy parser, parsers *idSet) {
if stringsContainDeprecated(parsers, p.name) { if parsers.has(p.id) {
panic(cannotIncludeParsers(p.name)) panic(cannotIncludeParsers(p.name))
} }

View File

@ -27,7 +27,7 @@ func (d *choiceDefinition) nodeName() string { return d.name }
func (d *choiceDefinition) nodeID() int { return d.id } func (d *choiceDefinition) nodeID() int { return d.id }
func (d *choiceDefinition) setID(id int) { d.id = id } func (d *choiceDefinition) setID(id int) { d.id = id }
func (d *choiceDefinition) parser(r *registry, parsers []string) (parser, error) { func (d *choiceDefinition) parser(r *registry, parsers *idSet) (parser, error) {
p, ok := r.parser(d.name) p, ok := r.parser(d.name)
if ok { if ok {
return p, nil return p, nil
@ -42,7 +42,8 @@ func (d *choiceDefinition) parser(r *registry, parsers []string) (parser, error)
r.setParser(cp) r.setParser(cp)
var elements []parser var elements []parser
parsers = append(parsers, d.name) parsers.set(d.id)
defer parsers.unset(d.id)
for _, e := range d.elements { for _, e := range d.elements {
element, ok := r.parser(e) element, ok := r.parser(e)
if ok { if ok {
@ -76,8 +77,8 @@ func (d *choiceDefinition) commitType() CommitType {
func (p *choiceParser) nodeName() string { return p.name } func (p *choiceParser) nodeName() string { return p.name }
func (p *choiceParser) nodeID() int { return p.id } func (p *choiceParser) nodeID() int { return p.id }
func (p *choiceParser) setIncludedBy(includedBy parser, parsers []string) { func (p *choiceParser) setIncludedBy(includedBy parser, parsers *idSet) {
if stringsContainDeprecated(parsers, p.name) { if parsers.has(p.id) {
return return
} }
@ -120,7 +121,7 @@ func (p *choiceParser) parse(t Trace, c *context) {
} }
c.exclude(c.offset, p.id) c.exclude(c.offset, p.id)
defer c.include(c.offset, p.id) // TODO: test if can be optimized initialOffset := c.offset
node := newNode(p.name, p.id, c.offset, c.offset, p.commit) node := newNode(p.name, p.id, c.offset, c.offset, p.commit)
var match bool var match bool
@ -157,10 +158,12 @@ func (p *choiceParser) parse(t Trace, c *context) {
if match { if match {
// t.Out1("choice, success") // t.Out1("choice, success")
c.success(node) c.success(node)
c.include(initialOffset, p.id) // TODO: test if can be optimized
return return
} }
// t.Out1("fail") // t.Out1("fail")
c.store.set(node.From, p.name, nil) c.store.set(node.From, p.name, nil)
c.fail(node.From) c.fail(node.From)
c.include(initialOffset, p.id) // TODO: test if can be optimized
} }

View File

@ -6,14 +6,14 @@ type definition interface {
nodeName() string nodeName() string
nodeID() int nodeID() int
setID(int) setID(int)
parser(*registry, []string) (parser, error) parser(*registry, *idSet) (parser, error)
commitType() CommitType commitType() CommitType
} }
type parser interface { type parser interface {
nodeName() string nodeName() string
nodeID() int nodeID() int
setIncludedBy(parser, []string) setIncludedBy(parser, *idSet)
storeIncluded(*context, *Node) storeIncluded(*context, *Node)
parse(Trace, *context) parse(Trace, *context)
} }

View File

@ -28,8 +28,8 @@ func (d *sequenceDefinition) nodeName() string { return d.name }
func (d *sequenceDefinition) nodeID() int { return d.id } func (d *sequenceDefinition) nodeID() int { return d.id }
func (d *sequenceDefinition) setID(id int) { d.id = id } func (d *sequenceDefinition) setID(id int) { d.id = id }
func (d *sequenceDefinition) parser(r *registry, parsers []string) (parser, error) { func (d *sequenceDefinition) parser(r *registry, parsers *idSet) (parser, error) {
if stringsContainDeprecated(parsers, d.name) { if parsers.has(d.id) {
panic(cannotIncludeParsers(d.name)) panic(cannotIncludeParsers(d.name))
} }
@ -51,7 +51,8 @@ func (d *sequenceDefinition) parser(r *registry, parsers []string) (parser, erro
ranges [][]int ranges [][]int
) )
parsers = append(parsers, d.name) parsers.set(d.id)
defer parsers.unset(d.id)
for _, item := range d.items { for _, item := range d.items {
if item.Min == 0 && item.Max == 0 { if item.Min == 0 && item.Max == 0 {
item.Min, item.Max = 1, 1 item.Min, item.Max = 1, 1
@ -97,8 +98,8 @@ func (d *sequenceDefinition) commitType() CommitType {
func (p *sequenceParser) nodeName() string { return p.name } func (p *sequenceParser) nodeName() string { return p.name }
func (p *sequenceParser) nodeID() int { return p.id } func (p *sequenceParser) nodeID() int { return p.id }
func (p *sequenceParser) setIncludedBy(includedBy parser, parsers []string) { func (p *sequenceParser) setIncludedBy(includedBy parser, parsers *idSet) {
if stringsContainDeprecated(parsers, p.name) { if parsers.has(p.id) {
return return
} }
@ -136,7 +137,7 @@ func (p *sequenceParser) parse(t Trace, c *context) {
} }
c.exclude(c.offset, p.id) c.exclude(c.offset, p.id)
defer c.include(c.offset, p.id) initialOffset := c.offset
items := p.items items := p.items
ranges := p.ranges ranges := p.ranges
@ -157,6 +158,7 @@ func (p *sequenceParser) parse(t Trace, c *context) {
// t.Out1("fail, item failed") // t.Out1("fail, item failed")
c.store.set(node.From, p.name, nil) c.store.set(node.From, p.name, nil)
c.fail(node.From) c.fail(node.From)
c.include(initialOffset, p.id)
return return
} }
@ -186,4 +188,5 @@ func (p *sequenceParser) parse(t Trace, c *context) {
} }
c.success(node) c.success(node)
c.include(initialOffset, p.id)
} }

View File

@ -137,7 +137,7 @@ func (s *Syntax) Init() error {
} }
var err error var err error
s.parser, err = s.root.parser(s.registry, nil) s.parser, err = s.root.parser(s.registry, &idSet{})
if err != nil { if err != nil {
s.initFailed = true s.initFailed = true
return err return err