aboutsummaryrefslogtreecommitdiff
path: root/spec/parser.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2022-03-28 22:31:30 +0900
committerRyo Nihei <nihei.dev@gmail.com>2022-03-29 01:45:05 +0900
commited43562cf58e8c0f9390421848879308fdfc60cb (patch)
tree16beff7d233b95ae53d2c8019bc47be378f304b8 /spec/parser.go
parentSimplify the syntax of #ast directive (diff)
downloadurubu-ed43562cf58e8c0f9390421848879308fdfc60cb.tar.gz
urubu-ed43562cf58e8c0f9390421848879308fdfc60cb.tar.xz
Add label notation
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 {