anchor.diff:   */
   grammar GraphQL;
   
  +//https://spec.graphql.org/June2018/#sec-Language.Document
   document: definition+;
   
   definition:
  -	execDefinition
  +	executableDefinition
   	| typeSystemDefinition
   	| typeSystemExtension;
   
  +//https://spec.graphql.org/June2018/#ExecutableDefinition
  +executableDefinition: operationDefinition | fragmentDefinition;
  +
  +//https://spec.graphql.org/June2018/#sec-Language.Operations
  +operationDefinition:
  +	operationType name? variableDefinitions? directives? selectionSet
  +	| selectionSet
  +	;
  +
  +operationType: 'query' | 'mutation' | 'subscription';
  +
  +//https://spec.graphql.org/June2018/#sec-Selection-Sets
  +selectionSet: '{' selection+ '}';
  +
  +selection: field
  +    | fragmentSpread
  +    | inlineFragment
  +    ;
  +//https://spec.graphql.org/June2018/#sec-Language.Fields
  +field: alias? name arguments? directives? selectionSet?;
  +
  +//https://spec.graphql.org/June2018/#sec-Language.Arguments
  +arguments: '(' argument+ ')';
  +argument: name ':' value;
  +
  +//https://spec.graphql.org/June2018/#sec-Field-Alias
  +alias: name ':';
  +
  +//https://spec.graphql.org/June2018/#sec-Language.Fragments
  +fragmentSpread: '...' fragmentName directives?;
  +fragmentDefinition:
  +	'fragment' fragmentName 'on' typeCondition directives? selectionSet;
  +fragmentName: name; // except on
  +
  +//https://spec.graphql.org/June2018/#sec-Type-Conditions
  +typeCondition: 'on' namedType;
  +
  +//https://spec.graphql.org/June2018/#sec-Inline-Fragments
  +inlineFragment:	'...' typeCondition? directives? selectionSet;
  +
  +//https://spec.graphql.org/June2018/#sec-Input-Values
  +value:
  +	 variable
  +	| intValue
  +	| floatValue
  +	| stringValue
  +	| booleanValue
  +	| nullValue
  +	| enumValue
  +	| listValue
  +	| objectValue
  +   ;
  +
  +//https://spec.graphql.org/June2018/#sec-Int-Value
  +intValue: INT;
  +
  +//https://spec.graphql.org/June2018/#sec-Float-Value
  +floatValue: FLOAT;
  +
  +//https://spec.graphql.org/June2018/#sec-Boolean-Value
  +booleanValue
  +	:	'true'
  +	|	'false'
  +	;
  +
  +//https://spec.graphql.org/June2018/#sec-String-Value
  +stringValue : STRING | BLOCK_STRING;
  +
  +//https://spec.graphql.org/June2018/#sec-Null-Value
  +nullValue: 'null';
  +
  +//https://spec.graphql.org/June2018/#sec-Enum-Value
  +enumValue: name; //{ not (nullValue | booleanValue) };
  +
  +//https://spec.graphql.org/June2018/#sec-List-Value
  +listValue: '[' ']'
  +    | '[' value+ ']'
  +    ;
  +
  +//https://spec.graphql.org/June2018/#sec-Input-Object-Values
  +objectValue: '{' '}'
  +    | '{' objectField '}'
  +    ;
  +
  +objectField: name ':' value;
  +
  +//https://spec.graphql.org/June2018/#sec-Language.Variables
  +variable: '$' name;
  +variableDefinitions: '(' variableDefinition+ ')';
  +variableDefinition: variable ':' type_ defaultValue?;
  +defaultValue: '=' value;
  +
  +//https://spec.graphql.org/June2018/#sec-Type-References
  +type_: namedType '!'?
  +    | listType '!'?
  +    ;
  +
  +namedType: name;
  +listType: '[' type_ ']';
  +
  +
  +//https://spec.graphql.org/June2018/#sec-Language.Directives
  +directives:  directive+;
  +directive: '@' name arguments?;
  +
   // https://graphql.github.io/graphql-spec/June2018/#TypeSystemDefinition
  -
  -typeSystemDefinition:
  -	schemaDefinition
  +typeSystemDefinition: schemaDefinition
   	| typeDefinition
  -	| directiveDefinition;
  +	| directiveDefinition
  +	;
  +
  +//https://spec.graphql.org/June2018/#TypeSystemExtension
  +typeSystemExtension: schemaExtension
  +    | typeExtension
  +    ;
   
   // https://graphql.github.io/graphql-spec/June2018/#sec-Schema
   schemaDefinition:
   	 'schema' directives? '{' rootOperationTypeDefinition+ '}';
   
   rootOperationTypeDefinition: operationType ':' namedType;
  -namedType: NAME;
  -
  -//https://graphql.github.io/graphql-spec/June2018/#TypeDefinition
  +
  +//https://spec.graphql.org/June2018/#sec-Schema-Extension
  +schemaExtension:
  +    'extend' 'schema' directives? '{' operationTypeDefinition+ '}'
  +    | 'extend' 'schema' directives
  +    ;
  +
  +//https://spec.graphql.org/June2018/#OperationTypeDefinition
  +operationTypeDefinition: operationType ':' namedType;
  +
  +
  +//https://spec.graphql.org/June2018/#sec-Descriptions
  +description: stringValue;
  +
  +//https://spec.graphql.org/June2018/#sec-Types
   typeDefinition:
   	scalarTypeDefinition
   	| objectTypeDefinition
  
positive.code: 
  
  fieldsDefinition: '{'  fieldDefinition+ '}';
  fieldDefinition: description? NAME  argumentsDefinition? ':' type_  directives? ;
  argumentsDefinition: '(' inputValueDefinition+ ')';
  inputValueDefinition:  description? NAME ':' type_ defaultValue? directives?;
  
  //https://graphql.github.io/graphql-spec/June2018/#sec-Interfaces
  interfaceTypeDefinition
   : description? 'interface' NAME directives? fieldsDefinition?;
  
  // https://graphql.github.io/graphql-spec/June2018/#sec-Unions
  unionTypeDefinition:  description? 'union' NAME directives? unionMemberTypes?;
  unionMemberTypes: '=' '|'?  type_ ('|' type_)* ;
  
  unionTypeExtension : 'extend' unionTypeDefinition;
  
  enumTypeDefinition:  description? 'enum' NAME directives? enumValuesDefinition?;
  enumValuesDefinition: '{' ( description? enumValue  directives?)+  '}';
  enumValue: NAME; //{ not (nullValue | booleanValue) };
  
  enumTypeExtension: 'extend' enumTypeDefinition;
  
  //https://graphql.github.io/graphql-spec/June2018/#InputObjectTypeDefinition
  inputObjectTypeDefinition: description? 'input' NAME directives? inputFieldsDefinition?;
  
  inputFieldsDefinition: '{' inputValueDefinition+ '}';
  
  directiveDefinition: description? 'directive' '@' NAME argumentsDefinition? 'on' directiveLocations;
  directiveLocations: directiveLocation ('|' directiveLocations)*;
  directiveLocation: executableDirectiveLocation | typeSystemDirectiveLocation;
  
  executableDirectiveLocation:
  'QUERY' |
  'MUTATION' |
  'SUBSCRIPTION' |
  'FIELD' |
  'FRAGMENT_DEFINITION' |
  'FRAGMENT_SPREAD' |
  'INLINE_FRAGMENT';
  
  typeSystemDirectiveLocation:
  'SCHEMA' |
  'SCALAR' |
  'OBJECT' |
  'FIELD_DEFINITION' |
  'ARGUMENT_DEFINITION' |
  'INTERFACE' |
  'UNION' |
  'ENUM' |
  'ENUM_VALUE' |
  'INPUT_OBJECT' |
  'INPUT_FIELD_DEFINITION';
  
  // https://graphql.github.io/graphql-spec/June2018/#sec-Type-System-Extensions
  typeSystemExtension: schemaExtension | typeExtension;
  
  schemaExtension: 'extend' schemaDefinition ;
  typeExtension: 'extend' typeDefinition;
  
  // original code: execution definitions
  // GraphQL Draft Specification - July 2015
  execDefinition: operationDefinition | fragmentDefinition;
  
  operationDefinition:
  	selectionSet
  	| operationType NAME? variableDefinitions? directives? selectionSet;
  
  selectionSet: '{' selection+ '}';
  
  operationType: 'query' | 'mutation' | 'subscription';
  
  selection: field | fragmentSpread | inlineFragment;
  
  field: alias? fieldName arguments? directives? selectionSet?;
  
  fieldName: NAME;
  
  alias: NAME ':';
  
  arguments: '(' argument+ ')';
  
  argument: NAME ':' value;
  
  fragmentSpread: '...' fragmentName directives?;
  
  inlineFragment:
  	'...' 'on' typeCondition directives? selectionSet;
  
  fragmentDefinition:
  	'fragment' fragmentName 'on' typeCondition directives? selectionSet;
  
  fragmentName: NAME;
  
  directives:  directive+;
  
  directive:
  	'@' NAME arguments?;
  
  typeCondition: typeName;
  
  variableDefinitions: '(' variableDefinition+ ')';
  
  variableDefinition: variable ':' type_ defaultValue?;
  
  variable: '$' NAME;
  
  defaultValue: '=' value;
  
  value:
  	 variable           # variableValue
  	| NUMBER	        # numberValue
  	| String_	        # stringValue
  	| BooleanLiteral	# booleanValue
  	| 'null'            # nullValue
  	| enumValue         # constValue
  	| array		        # arrayValue
  	| object            # objectValue
     ;
  
  object: '{' '}'
      | '{' objectField '}'
      ;
  
  objectField: NAME ':' value;
  
  BooleanLiteral
  	:	'true'
  	|	'false'
  	;
  
  type_: typeName nonNull? | listType nonNull?;
  
  typeName: NAME;
  
  listType: '[' type_ ']';
  
  nonNull: '!';
  
  array: '[' value+ ']'
      | '[' ']'
      ;
  
  NAME: [_A-Za-z] [_0-9A-Za-z]*;
  
  String_ : STRING | BLOCK_STRING;
  
  STRING: '"' ( ESC | ~ ["\\])* '"';
  
  BLOCK_STRING
      :   '"""' .*? '"""'
  
negative.code: 
  fragment HEX: [0-9a-fA-F];
  
  fragment NONZERO_DIGIT: [1-9];
  fragment DIGIT: [0-9];
  fragment FRACTIONAL_PART: '.' DIGIT+;
  fragment EXPONENTIAL_PART: EXPONENT_INDICATOR SIGN? DIGIT+;
  fragment EXPONENT_INDICATOR: [eE];
  fragment SIGN: [+-];
  fragment NEGATIVE_SIGN: '-';
  
  FLOAT: INT FRACTIONAL_PART
      | INT EXPONENTIAL_PART
      | INT FRACTIONAL_PART EXPONENTIAL_PART
      ;
  
  INT: NEGATIVE_SIGN? '0'?
      | NEGATIVE_SIGN? NONZERO_DIGIT DIGIT*
      ;
  
  PUNCTUATOR: '!'
      | '$'
      | '(' | ')'
  