normalize, skeleton

This commit is contained in:
Arpad Ryszka 2017-08-06 20:32:59 +02:00
parent 950eb2f2f6
commit 74549f3576
5 changed files with 46 additions and 4 deletions

View File

@ -27,6 +27,7 @@ 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 = id } func (p *charParser) setID(id int) { p.id = id }
func (p *charParser) commitType() CommitType { return Alias } func (p *charParser) commitType() CommitType { return Alias }
func (p *charParser) normalize(*registry, *idSet) error { return nil }
func (p *charParser) init(r *registry) error { return nil } func (p *charParser) init(r *registry) error { return nil }

View File

@ -38,6 +38,24 @@ 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) commitType() CommitType { return d.commit } func (d *choiceDefinition) commitType() CommitType { return d.commit }
func (d *choiceDefinition) normalize(r *registry, path *idSet) error {
if path.has(d.id) {
return nil
}
path.set(d.id)
for i := range d.elements {
element, ok := r.definition(d.elements[i])
if !ok {
return parserNotFound(d.elements[i])
}
element.normalize(r, path)
}
return nil
}
func (d *choiceDefinition) init(r *registry) error { func (d *choiceDefinition) init(r *registry) error {
if d.cbuilder == nil { if d.cbuilder == nil {
d.cbuilder = &choiceBuilder{ d.cbuilder = &choiceBuilder{

View File

@ -7,6 +7,7 @@ type definition interface {
nodeID() int nodeID() int
commitType() CommitType commitType() CommitType
setID(int) setID(int)
normalize(*registry, *idSet) error
init(*registry) error init(*registry) error
setIncludedBy(*registry, int, *idSet) error setIncludedBy(*registry, int, *idSet) error
parser(*registry, *idSet) (parser, error) parser(*registry, *idSet) (parser, error)

View File

@ -44,6 +44,24 @@ 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) commitType() CommitType { return d.commit } func (d *sequenceDefinition) commitType() CommitType { return d.commit }
func (d *sequenceDefinition) normalize(r *registry, path *idSet) error {
if path.has(d.id) {
return nil
}
path.set(d.id)
for i := range d.items {
element, ok := r.definition(d.items[i].Name)
if !ok {
return parserNotFound(d.items[i].Name)
}
element.normalize(r, path)
}
return nil
}
func (d *sequenceDefinition) includeItems() bool { func (d *sequenceDefinition) includeItems() bool {
return len(d.items) == 1 && d.items[0].Min == 1 && d.items[0].Max == 1 return len(d.items) == 1 && d.items[0].Min == 1 && d.items[0].Max == 1
} }

View File

@ -144,6 +144,10 @@ func (s *Syntax) Init() error {
return ErrRootAlias return ErrRootAlias
} }
if err := s.root.normalize(s.registry, &idSet{}); err != nil {
return err
}
for _, p := range s.registry.definitions { for _, p := range s.registry.definitions {
p.init(s.registry) p.init(s.registry)
} }