aboutsummaryrefslogtreecommitdiff
path: root/spec/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'spec/parser.go')
-rw-r--r--spec/parser.go29
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 {