diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2022-03-28 22:31:30 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2022-03-29 01:45:05 +0900 |
commit | ed43562cf58e8c0f9390421848879308fdfc60cb (patch) | |
tree | 16beff7d233b95ae53d2c8019bc47be378f304b8 /spec/parser.go | |
parent | Simplify the syntax of #ast directive (diff) | |
download | urubu-ed43562cf58e8c0f9390421848879308fdfc60cb.tar.gz urubu-ed43562cf58e8c0f9390421848879308fdfc60cb.tar.xz |
Add label notation
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 { |