func buildParser() parser.Parser { constantValue := parser.Lexeme(parser.Any(quotedString(), integer(), float())) namespaceDef := parser.Collect( parser.Identifier(), parser.Identifier()) includeDef := parser.Collect( parser.Lexeme(quotedString())) var typeDef func(st *parser.State) (parser.Output, bool, error) recurseTypeDef := func(st *parser.State) (parser.Output, bool, error) { return typeDef(st) } typeDef = parser.Any( parser.Identifier(), parser.Collect(parser.Symbol("list"), parser.Symbol("<"), recurseTypeDef, parser.Symbol(">")), parser.Collect(parser.Symbol("set"), parser.Symbol("<"), recurseTypeDef, parser.Symbol(">")), parser.Collect(parser.Symbol("map"), parser.Symbol("<"), recurseTypeDef, parser.Symbol(","), recurseTypeDef, parser.Symbol(">")), ) typedefDef := parser.Collect(typeDef, parser.Identifier()) constDef := parser.Collect( typeDef, parser.Identifier(), parser.Symbol("="), constantValue, parser.Any( parser.Symbol(","), parser.Symbol(";"), parser.Symbol(""), ), ) enumItemDef := parser.Collect( parser.Identifier(), parser.Any( parser.All(parser.Symbol("="), parser.Lexeme(integer())), nilParser(), ), parser.Any(parser.Symbol(","), parser.Symbol(";"), parser.Symbol("")), ) enumDef := parser.Collect( parser.Identifier(), parser.Symbol("{"), parser.Many(enumItemDef), parser.Symbol("}"), ) structFieldDef := parser.Collect( parser.Any( parser.Collect(parser.Lexeme(integer()), parser.Symbol(":")), nilParser(), ), parser.Any(parser.Symbol("required"), parser.Symbol("optional"), parser.Symbol("")), typeDef, parser.Identifier(), // Default parser.Any( parser.All(parser.Symbol("="), parser.Lexeme(parser.Any( parser.Identifier(), quotedString(), parser.Try(float()), integer()))), nilParser(), ), parser.Skip(parser.Any(parser.Symbol(","), parser.Symbol(";"), parser.Symbol(""))), ) structDef := parser.Collect( parser.Identifier(), parser.Symbol("{"), parser.Many(structFieldDef), parser.Symbol("}"), ) serviceMethodDef := parser.Collect( // // parser.Comments(), // parser.Whitespace(), parser.Any(parser.Symbol("oneway"), parser.Symbol("")), typeDef, parser.Identifier(), parser.Symbol("("), parser.Many(structFieldDef), parser.Symbol(")"), // Exceptions parser.Any( parser.Collect( parser.Symbol("throws"), parser.Symbol("("), parser.Many(structFieldDef), parser.Symbol(")"), ), nilParser(), ), parser.Any(parser.Symbol(","), parser.Symbol(";"), parser.Symbol("")), ) // <identifier> [extends <identifier>] { <*serviceMethodDef> } serviceDef := parser.Collect( parser.Identifier(), parser.Any( parser.Collect(parser.Symbol("extends"), parser.Identifier()), nilParser(), ), parser.Symbol("{"), parser.Many(serviceMethodDef), parser.Symbol("}"), ) thriftSpec := parser.All(parser.Whitespace(), parser.Many( symbolDispatcher(map[string]parser.Parser{ "namespace": namespaceDef, "typedef": typedefDef, "const": constDef, "include": includeDef, "enum": enumDef, "exception": structDef, "struct": structDef, "service": serviceDef, }), )) return thriftSpec }
Offset int Left string } func (e *ErrSyntaxError) Error() string { return fmt.Sprintf("Syntax Error %s:%d column %d offset %d", e.File, e.Line, e.Column, e.Offset) } var ( ErrParserFail = errors.New("thrift.parser: parsing failed entirely") spec = parser.Spec{ CommentStart: "/*", CommentEnd: "*/", CommentLine: parser.Any(parser.String("#"), parser.String("//")), NestedComments: true, IdentStart: parser.Satisfy( func(c rune) bool { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_' }), IdentLetter: parser.Satisfy( func(c rune) bool { return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '.' || c == '_' }), ReservedNames: []string{ "namespace", "struct", "enum", "const", "service", "throws", "required", "optional", "exception", "list", "map", "set",