Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
	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",