From ed43562cf58e8c0f9390421848879308fdfc60cb Mon Sep 17 00:00:00 2001 From: Ryo Nihei Date: Mon, 28 Mar 2022 22:31:30 +0900 Subject: Add label notation --- spec/parser.go | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'spec/parser.go') 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 { -- cgit v1.2.3