diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-07-02 02:44:38 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-07-02 22:11:50 +0900 |
commit | 73ab65855eb2bac9b893c381439d43b9436fdcfd (patch) | |
tree | aca8d9a77d670dfd7e4cc54ff5a6519096bec4ae /spec/parser.go | |
parent | Prettify trees (diff) | |
download | cotia-73ab65855eb2bac9b893c381439d43b9436fdcfd.tar.gz cotia-73ab65855eb2bac9b893c381439d43b9436fdcfd.tar.xz |
Allow directives to take multiple parameters
Diffstat (limited to 'spec/parser.go')
-rw-r--r-- | spec/parser.go | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/spec/parser.go b/spec/parser.go index 8322a3f..da17498 100644 --- a/spec/parser.go +++ b/spec/parser.go @@ -26,8 +26,8 @@ type ElementNode struct { } type DirectiveNode struct { - Name string - Parameter *ParameterNode + Name string + Parameters []*ParameterNode } type ParameterNode struct { @@ -260,10 +260,25 @@ func (p *parser) parseDirective() *DirectiveNode { } name := p.lastTok.text - var param *ParameterNode + var params []*ParameterNode + for { + param := p.parseParameter() + if param == nil { + break + } + params = append(params, param) + } + + return &DirectiveNode{ + Name: name, + Parameters: params, + } +} + +func (p *parser) parseParameter() *ParameterNode { switch { case p.consume(tokenKindID): - param = &ParameterNode{ + return &ParameterNode{ ID: p.lastTok.text, } case p.consume(tokenKindTreeNodeOpen): @@ -292,7 +307,7 @@ func (p *parser) parseDirective() *DirectiveNode { raiseSyntaxError(synErrTreeUnclosed) } - param = &ParameterNode{ + return &ParameterNode{ Tree: &TreeStructNode{ Name: name, Children: children, @@ -300,10 +315,7 @@ func (p *parser) parseDirective() *DirectiveNode { } } - return &DirectiveNode{ - Name: name, - Parameter: param, - } + return nil } func (p *parser) consume(expected tokenKind) bool { |