From 73ab65855eb2bac9b893c381439d43b9436fdcfd Mon Sep 17 00:00:00 2001 From: Ryo Nihei Date: Fri, 2 Jul 2021 02:44:38 +0900 Subject: Allow directives to take multiple parameters --- spec/parser.go | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'spec/parser.go') 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 { -- cgit v1.2.3