aboutsummaryrefslogtreecommitdiff
path: root/spec/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'spec/parser.go')
-rw-r--r--spec/parser.go27
1 files changed, 22 insertions, 5 deletions
diff --git a/spec/parser.go b/spec/parser.go
index 53bf491..9778521 100644
--- a/spec/parser.go
+++ b/spec/parser.go
@@ -4,6 +4,7 @@ import (
"fmt"
"io"
+ mlspec "github.com/nihei9/maleeni/spec"
verr "github.com/nihei9/vartan/error"
)
@@ -47,9 +48,10 @@ type DirectiveNode struct {
}
type ParameterNode struct {
- ID string
- Tree *TreeStructNode
- Pos Position
+ ID string
+ String string
+ Tree *TreeStructNode
+ Pos Position
}
type TreeStructNode struct {
@@ -262,10 +264,15 @@ func (p *parser) parseFragment() *FragmentNode {
raiseSyntaxError(p.pos.Row, synErrNoColon)
}
- if !p.consume(tokenKindTerminalPattern) {
+ var rhs string
+ switch {
+ case p.consume(tokenKindTerminalPattern):
+ rhs = p.lastTok.text
+ case p.consume(tokenKindStringLiteral):
+ rhs = mlspec.EscapePattern(p.lastTok.text)
+ default:
raiseSyntaxError(p.pos.Row, synErrFragmentNoPattern)
}
- rhs := p.lastTok.text
p.consume(tokenKindNewline)
@@ -398,6 +405,11 @@ func (p *parser) parseElement() *ElementNode {
Pattern: p.lastTok.text,
Pos: p.lastTok.pos,
}
+ case p.consume(tokenKindStringLiteral):
+ return &ElementNode{
+ Pattern: mlspec.EscapePattern(p.lastTok.text),
+ Pos: p.lastTok.pos,
+ }
}
return nil
}
@@ -436,6 +448,11 @@ func (p *parser) parseParameter() *ParameterNode {
ID: p.lastTok.text,
Pos: p.lastTok.pos,
}
+ case p.consume(tokenKindStringLiteral):
+ return &ParameterNode{
+ String: p.lastTok.text,
+ Pos: p.lastTok.pos,
+ }
case p.consume(tokenKindTreeNodeOpen):
if !p.consume(tokenKindID) {
raiseSyntaxError(p.pos.Row, synErrTreeInvalidFirstElem)