github.com/vcilabs/webrpc@v0.5.2-0.20201116131534-162e27b1b33b/schema/ridl/enum_parser.go (about) 1 package ridl 2 3 func parserStateEnumExplicitValue(en *EnumNode, dn *DefinitionNode) parserState { 4 return func(p *parser) parserState { 5 // [= <value>] 6 _, err := p.match(tokenWhitespace, tokenEqual, tokenWhitespace) 7 8 if err == nil { 9 explicitValue, err := p.expectLiteralValue() 10 if err != nil { 11 return p.stateError(err) 12 } 13 dn.rightNode = newTokenNode(explicitValue) 14 } 15 16 en.values = append(en.values, dn) 17 18 return parserStateEnumDefinition(en) 19 } 20 } 21 22 func parserStateEnumDefinition(et *EnumNode) parserState { 23 return func(p *parser) parserState { 24 tok := p.cursor() 25 26 switch tok.tt { 27 28 case tokenDash: 29 // - <name> [= <value>] [<# comment>][EOL] 30 matches, err := p.match(tokenDash, tokenWhitespace, tokenWord) 31 32 if err != nil { 33 return p.stateError(err) 34 } 35 36 return parserStateEnumExplicitValue(et, &DefinitionNode{ 37 leftNode: newTokenNode(matches[2]), 38 }) 39 40 case tokenNewLine, tokenWhitespace: 41 p.next() 42 43 case tokenHash: 44 p.continueUntilEOL() 45 46 default: 47 p.emit(et) 48 return parserDefaultState 49 50 } 51 52 return parserStateEnumDefinition(et) 53 } 54 } 55 56 func parserStateEnum(p *parser) parserState { 57 // enum <name>: <type>[<# comment>] 58 matches, err := p.match(tokenWord, tokenWhitespace, tokenWord, tokenColon, tokenWhitespace, tokenWord, tokenEOL) 59 if err != nil { 60 return p.stateError(err) 61 } 62 63 if matches[0].val != wordEnum { 64 return p.stateError(errUnexpectedToken) 65 } 66 67 return parserStateEnumDefinition(&EnumNode{ 68 name: newTokenNode(matches[2]), 69 enumType: newTokenNode(matches[5]), 70 values: []*DefinitionNode{}, 71 }) 72 }