diff options
Diffstat (limited to 'spec/parser.go')
-rw-r--r-- | spec/parser.go | 27 |
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) |