anchor.diff:  	| ','
   ;
   
  -type_
  -	: singleType
  -	| unionType null_
  -;
  -
  -singleType
  -	: nonAnyType
  -	| 'any'
  -;
  -
  -unionType
  -	: '(' unionMemberType 'or' unionMemberType unionMemberTypes ')'
  -;
  -
  -unionMemberType
  -	: nonAnyType
  -	| unionType null_
  -;
  -
  -unionMemberTypes
  -	: 'or' unionMemberType unionMemberTypes
  -	| /* empty */
  -;
  -
  -nonAnyType
  -	: primitiveType  null_
  -	| promiseType null_
  -	| 'ByteString'  null_
  -	| 'DOMString'  null_
  -	| 'USVString'  null_
  -	| IDENTIFIER_WEBIDL  null_
  -	| 'sequence' '<' type_ '>' null_
  -	| 'object'  null_
  -	| 'RegExp'  null_
  -	| 'DOMException'  null_
  -	| bufferRelatedType  null_
  -	| 'FrozenArray' '<' type_ '>' null_
  -;
  -
  -bufferRelatedType
  -	: 'ArrayBuffer'
  -	| 'DataView'
  -	| 'Int8Array'
  -	| 'Int16Array'
  -	| 'Int32Array'
  -	| 'Uint8Array'
  -	| 'Uint16Array'
  -	| 'Uint32Array'
  -	| 'Uint8ClampedArray'
  -	| 'Float32Array'
  -	| 'Float64Array'
  -;
  -
  -constType
  -	: primitiveType null_
  -	| IDENTIFIER_WEBIDL null_
  -;
  -
  -primitiveType
  -	: unsignedIntegerType
  -	| unrestrictedFloatType
  -	| 'boolean'
  -	| 'byte'
  -	| 'octet'
  -;
  -
  -unrestrictedFloatType
  -	: 'unrestricted' floatType
  -	| floatType
  -;
  -
  -floatType
  -	: 'float'
  -	| 'double'
  -;
  -
  -unsignedIntegerType
  -	: 'unsigned' integerType
  -	| integerType
  -;
  -
  -integerType
  -	: 'short'
  -	| 'long' optionalLong
  -;
  -
  -optionalLong
  -	: 'long'
  -	| /* empty */
  -;
  -
  -promiseType
  -	: 'Promise' '<' returnType '>'
  -;
  -
  -null_
  -	: '?'
  -	| /* empty */
  -;
  -
  -returnType
  -	: type_
  -	| 'void'
  -;
  -
   identifierList
   	: IDENTIFIER_WEBIDL identifiers
   ;
  
positive.code: ;
  
  argument
  	: extendedAttributeList optionalOrRequiredArgument
  ;
  
  optionalOrRequiredArgument
  	: 'optional' type_ argumentName default_
  	| type_ ellipsis argumentName
  ;
  
  argumentName
  
negative.code: ;
  
  interfaceMember
      : partialInterfaceMember
      | constructor
  ;
  
  partialInterfaceMembers
      : extendedAttributeList partialInterfaceMember partialInterfaceMembers
      | /* empty */
  ;
  
  partialInterfaceMember
  	: const_
  	| operation
  	| stringifier
  	| staticMember
  	| iterable
  	| asyncIterable
  	| readonlyMember
  	| readWriteAttribute
  	| readWriteMaplike
  	| readWriteSetlike
  	| inheritAttribute
  ;
  
  inheritance
  	: ':' IDENTIFIER_WEBIDL
  	| /* empty */
  ;
  
  mixinRest
      : 'mixin' IDENTIFIER_WEBIDL '{' mixinMembers '}' ';'
  ;
  
  mixinMembers
      : extendedAttributeList mixinMember mixinMembers
      | /* empty */
  ;
  
  mixinMember
      : const_
      | regularOperation
      | stringifier
      | optionalReadOnly attributeRest
  ;
  
  includesStatement
  	: IDENTIFIER_WEBIDL 'includes' IDENTIFIER_WEBIDL ';'
  ;
  
  callbackRestOrInterface
  	: callbackRest
  	| 'interface' IDENTIFIER_WEBIDL '{' callbackInterfaceMembers '}' ';'
  ;
  
  callbackInterfaceMembers
      : extendedAttributeList callbackInterfaceMember callbackInterfaceMembers
      | /* empty */
  ;
  
  callbackInterfaceMember
      : const_
      | regularOperation
  ;
  
  const_
  	: 'const' constType IDENTIFIER_WEBIDL '=' constValue ';'
  ;
  
  constValue
  	: booleanLiteral
  	| floatLiteral
  	| INTEGER_WEBIDL
  	| 'null'    //TODO: webidl grammar doesn't include null in constValue, but
  	            // the docs seem to imply that its valid
  ;
  
  booleanLiteral
  	: 'true'
  	| 'false'
  ;
  
  floatLiteral
  	: DECIMAL_WEBIDL
  	| '-Infinity'
  	| 'Infinity'
  	| 'NaN'
  ;
  
  constType
  	: primitiveType
  	| IDENTIFIER_WEBIDL
  ;
  
  readonlyMember
  	: 'readonly' readonlyMemberRest
  ;
  
  readonlyMemberRest
  	: attributeRest
  	| maplikeRest
  	| setlikeRest
  ;
  
  readWriteAttribute
  	: attributeRest
  ;
  
  inheritAttribute
      : 'inherit' attributeRest
  ;
  
  attributeRest
  	: 'attribute' typeWithExtendedAttributes attributeName ';'
  ;
  
  attributeName
  	: attributeNameKeyword
  	| IDENTIFIER_WEBIDL
  ;
  
  attributeNameKeyword
  	: 'async'
  	| 'required'
  ;
  
  optionalReadOnly
      : 'readonly'
      | /* empty */
  ;
  
  defaultValue
  	: constValue
  	| STRING_WEBIDL
  	| '[' ']'
  	| '{' '}'
  	| 'null'
  ;
  
  operation
  	: regularOperation
  	| specialOperation
  ;
  
  regularOperation
      : type_ operationRest
  ;
  
  specialOperation
  	: special regularOperation
  ;
  
  special
  	: 'getter'
  	| 'setter'
  	| 'deleter'
  ;
  
  operationRest
  	: optionalOperationName '(' argumentList ')' ';'
  ;
  
  optionalOperationName
  	: operationName
  	| /* empty */
  ;
  
  operationName
      : operationNameKeyword
      | IDENTIFIER_WEBIDL
  ;
  
  operationNameKeyword
      : 'includes'
  ;
  
  argumentList
  