@top SourceFile { Document } @precedence { fieldDef @right, typeDef @right } Document { Definition+ } Definition { ExecutableDefinition | TypeSystemDefinition | TypeSystemExtension } ExecutableDefinition { OperationDefinition | FragmentDefinition } TypeSystemDefinition { SchemaDefinition | TypeDefinition | DirectiveDefinition } TypeSystemExtension { SchemaExtension | TypeExtension } SchemaKeyword { @specialize } SchemaDefinition { Description? SchemaKeyword Directives? RootTypeDef } RootTypeDef { "{" RootOperationTypeDefinition+ "}" } ExtendKeyword { @specialize } SchemaExtension { ExtendKeyword SchemaKeyword Directives? RootTypeDef } TypeExtension { ScalarTypeExtension | ObjectTypeExtension | InterfaceTypeExtension | UnionTypeExtension | EnumTypeExtension | InputObjectTypeExtension } ScalarKeyword { @specialize } ScalarTypeExtension { ExtendKeyword ScalarKeyword Name Directives } ObjectTypeExtension /* precedence: right 0 */ { ExtendKeyword TypeKeyword Name ImplementsInterfaces? Directives? !typeDef FieldsDefinition | ExtendKeyword TypeKeyword Name ImplementsInterfaces? Directives? } InterfaceKeyword { @specialize } InterfaceTypeExtension /* precedence: right 0 */ { ExtendKeyword InterfaceKeyword Name ImplementsInterfaces? Directives? FieldsDefinition | ExtendKeyword InterfaceKeyword Name ImplementsInterfaces? Directives? } UnionKeyword { @specialize } UnionTypeExtension /* precedence: right 0 */ { ExtendKeyword UnionKeyword Name Directives? UnionMemberTypes | ExtendKeyword UnionKeyword Name Directives? } EnumKeyword { @specialize } EnumTypeExtension /* precedence: right 0 */ { ExtendKeyword EnumKeyword Name Directives? !typeDef EnumValuesDefinition | ExtendKeyword EnumKeyword Name Directives? } InputKeyword { @specialize } InputObjectTypeExtension /* precedence: right 0 */ { ExtendKeyword InputKeyword Name Directives? InputFieldsDefinition+ | ExtendKeyword InputKeyword Name Directives? } InputFieldsDefinition { !fieldDef "{" InputValueDefinition+ "}" } EnumValuesDefinition { !fieldDef "{" EnumValueDefinition+ "}" } EnumValueDefinition { Description? EnumValue Directives? } ImplementsKeyword { @specialize } ImplementsInterfaces { ImplementsInterfaces "&" NamedType | ImplementsKeyword "&"? NamedType } FieldsDefinition { !fieldDef "{" FieldDefinition+ "}" } FieldDefinition { Description? Name ArgumentsDefinition? ":" Type Directives? } ArgumentsDefinition { "(" InputValueDefinition+ ")" } InputValueDefinition { Description? Name ":" Type DefaultValue? Directives? } DefaultValue { "=" Value } UnionMemberTypes { UnionMemberTypes "|" NamedType | "=" "|"? NamedType } RootOperationTypeDefinition { OperationType ":" NamedType } OperationDefinition { SelectionSet | OperationType Name? VariableDefinitions? Directives? SelectionSet } TypeDefinition { ScalarTypeDefinition | ObjectTypeDefinition | InterfaceTypeDefinition | UnionTypeDefinition | EnumTypeDefinition | InputObjectTypeDefinition } ScalarTypeDefinition /* precedence: right 0 */ { Description? ScalarKeyword Name Directives? } TypeKeyword { @specialize } ObjectTypeDefinition /* precedence: right 0 */ { Description? TypeKeyword Name ImplementsInterfaces? Directives? FieldsDefinition? } InterfaceTypeDefinition /* precedence: right 0 */ { Description? InterfaceKeyword Name ImplementsInterfaces? Directives? FieldsDefinition? } UnionTypeDefinition /* precedence: right 0 */ { Description? UnionKeyword Name Directives? UnionMemberTypes? } EnumTypeDefinition /* precedence: right 0 */ { Description? EnumKeyword Name Directives? !typeDef EnumValuesDefinition? } InputObjectTypeDefinition /* precedence: right 0 */ { Description? InputKeyword Name Directives? !typeDef InputFieldsDefinition? } VariableDefinitions { "(" VariableDefinition+ ")" } VariableDefinition { Variable ":" Type DefaultValue? Directives? Comma? } SelectionSet { "{" Selection* "}" } Selection { Field | InlineFragment | FragmentSpread } Field { Alias? Name Arguments? Directive? SelectionSet? } Alias { Name ":" } Arguments { "(" Argument+ ")" } Argument { Name ":" Value } Value { Variable | StringValue | IntValue | FloatValue | BooleanValue | NullValue | EnumValue | ListValue | ObjectValue } Variable { "$" Name } EnumValue { Name } ListValue { "[" Value* "]" } ObjectValue { "{" ObjectField* "}" } ObjectField { Name ":" Value Comma? } FragmentSpread { "..." FragmentName Directives? } FragmentKeyword { @specialize } FragmentDefinition { FragmentKeyword FragmentName TypeCondition Directives? SelectionSet } FragmentName { Name } InlineFragment { "..." TypeCondition? Directives? SelectionSet } OnKeyword { @specialize } TypeCondition { OnKeyword NamedType } Directives { Directive+ } DirectiveName { "@" Name } Directive { DirectiveName Arguments? } DirectiveKeyword { @specialize } RepeatableKeyword { @specialize } DirectiveDefinition /* precedence: right 1 */ { Description? DirectiveKeyword "@" Name ArgumentsDefinition? RepeatableKeyword ? OnKeyword DirectiveLocations } DirectiveLocations { DirectiveLocations "|" DirectiveLocation | "|"? DirectiveLocation } DirectiveLocation { ExecutableDirectiveLocation | TypeSystemDirectiveLocation } Type { NamedType | ListType | NonNullType } NamedType { Name } ListType { "[" Type "]" } NonNullType { NamedType "!" | ListType "!" } Description { StringValue } OperationType { @specialize | @specialize | @specialize } BooleanValue { @specialize | @specialize } NullValue { @specialize } ExecutableDirectiveLocation { @specialize | @specialize | @specialize | @specialize | @specialize | @specialize | @specialize | @specialize } TypeSystemDirectiveLocation { @specialize | @specialize | @specialize | @specialize | @specialize | @specialize | @specialize | @specialize | @specialize | @specialize | @specialize } @tokens { whitespace { std.whitespace+ } StringValue { "\"\"\"" (!["] | "\\n" | "\"" "\""? !["])* "\"\"\"" | "\"" !["\\\n]* "\"" } IntValue { "-"? "0" | "-"? std.digit+ } FloatValue { IntValue ("." std.digit+ | ("e" | "E") IntValue+) } @precedence { IntValue, FloatValue } Name { $[_A-Za-z] $[_0-9A-Za-z]* } Comma { "," } Comment { "#" ![\n]* } "{" "}" } @skip { whitespace | Comment } @detectDelim