diff options
Diffstat (limited to 'spec/parser.go')
-rw-r--r-- | spec/parser.go | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/spec/parser.go b/spec/parser.go index a453538..a9e4d62 100644 --- a/spec/parser.go +++ b/spec/parser.go @@ -38,10 +38,16 @@ type AlternativeNode struct { type ElementNode struct { ID string Pattern string + Label *LabelNode Literally bool Pos Position } +type LabelNode struct { + Name string + Pos Position +} + type DirectiveNode struct { Name string Parameters []*ParameterNode @@ -383,25 +389,40 @@ func (p *parser) parseAlternative() *AlternativeNode { } func (p *parser) parseElement() *ElementNode { + var elem *ElementNode switch { case p.consume(tokenKindID): - return &ElementNode{ + elem = &ElementNode{ ID: p.lastTok.text, Pos: p.lastTok.pos, } case p.consume(tokenKindTerminalPattern): - return &ElementNode{ + elem = &ElementNode{ Pattern: p.lastTok.text, Pos: p.lastTok.pos, } case p.consume(tokenKindStringLiteral): - return &ElementNode{ + elem = &ElementNode{ Pattern: p.lastTok.text, Literally: true, Pos: p.lastTok.pos, } + default: + if p.consume(tokenKindLabelMarker) { + raiseSyntaxError(p.pos.Row, synErrLabelWithNoSymbol) + } + return nil + } + if p.consume(tokenKindLabelMarker) { + if !p.consume(tokenKindID) { + raiseSyntaxError(p.pos.Row, synErrNoLabel) + } + elem.Label = &LabelNode{ + Name: p.lastTok.text, + Pos: p.lastTok.pos, + } } - return nil + return elem } func (p *parser) parseDirective() *DirectiveNode { |