anchor.diff:  		| NOT LESSTHANCHAR
   		| GREATER THAN? OR EQUAL TO?
   		| MORETHANOREQUAL
  -	) qualifiedDataName)?
  -	(INVALID KEY? statements)?
  -	(NOT INVALID KEY? statements)?
  -	END_START?
  +	)
  +	qualifiedDataName
   ;
   
   // stop statement
  
positive.code: // return statement
  
  returnStatement :
  	RETURN fileName RECORD? (INTO qualifiedDataName)?
  	AT? END statements
  	(NOT AT END statements)?
  	END_RETURN?
  ;
  
  // rewrite statement
  
  rewriteStatement :
  	REWRITE recordName (FROM identifier)?
  	(INVALID KEY? statements)?
  	(NOT INVALID KEY? statements)?
  	END_REWRITE?
  ;
  
  // search statement
  
  searchStatement :
  	SEARCH ALL? qualifiedDataName
  	(VARYING qualifiedDataName)?
  	(AT? END statements)?
  	(WHEN condition (statements | NEXT SENTENCE))+
  	END_SEARCH?
  ;
  
  // send statement
  
  sendStatement :
  	SEND (sendStatementSync | sendStatementAsync)
  ;
  
  sendStatementSync :
  	(identifier | literal) (FROM identifier)?
  	(
  		WITH (identifier | EGI | EMI | ESI)
  	)?
  	(REPLACING LINE?)?
  	sendAdvancingPhrase?
  	onExceptionClause?
  	notOnExceptionClause?
  ;
  
  sendStatementAsync :
  	TO (TOP | BOTTOM) identifier
  	onExceptionClause?
  	notOnExceptionClause?
  ;
  
  sendAdvancingPhrase :
  	(BEFORE | AFTER) ADVANCING?
  	(
  		PAGE
  		| (identifier | literal) (LINE | LINES)?
  		| mnemonicName
  	)
  ;
  
  // set statement
  
  setStatement :
  	SET (setToStatement	| setUpDownByStatement)
  ;
  
  setToStatement :
  	(identifier+ TO (identifier | ON | OFF | literal))+
  ;
  
  setUpDownByStatement :
  	identifier+ (UP BY | DOWN BY) (identifier | literal)
  ;
  
  // sort statement
  
  sortStatement :
  	SORT fileName
  	(ON? (ASCENDING | DESCENDING) KEY? qualifiedDataName+)+
  	(WITH? DUPLICATES IN? ORDER?)?
  	(
  		COLLATING? SEQUENCE IS? alphabetName+
  		(FOR? ALPHANUMERIC IS? alphabetName)?
  		(FOR? NATIONAL IS? alphabetName)?
  	)?
  	(
  		USING fileName+ 
  		| INPUT PROCEDURE IS? procedureName ((THROUGH | THRU) procedureName)?
  	)
  	(
  		GIVING (fileName (LOCK | SAVE | NO REWIND | CRUNCH | RELEASE | WITH REMOVE CRUNCH)?)+
  		| OUTPUT PROCEDURE IS? procedureName ((THROUGH | THRU) procedureName)?
  	)
  ;
  
  // start statement
  
  startStatement :
  	START fileName
  	(KEY IS? (
  		EQUAL TO?
  		| EQUALCHAR
  		| GREATER THAN?
  
negative.code: // alter statement
  
  alterStatement :
  	ALTER alterProceedTo+
  ;
  
  alterProceedTo :
  	procedureName TO (PROCEED TO)? procedureName
  ;
  
  // call statement
  