anchor.diff:  
   WS  :	[ \t\r\n\f]+ -> channel(HIDDEN)	;
   
  +// Many language targets use {} as block delimiters and so we
  +// must recursively match {} delimited blocks to balance the
  +// braces. Additionally, we must make some assumptions about
  +// literal string representation in the target language. We assume
  +// that they are delimited by ' or " and so consume these
  +// in their own alts so as not to inadvertantly match {}.
  +
  +ACTION
  +	:	'{'
  +		(	ACTION
  +		|	ACTION_ESCAPE
  +        |	ACTION_STRING_LITERAL
  +        |	ACTION_CHAR_LITERAL
  +        |	'/*' .*? '*/' // ('*/' | EOF)
  +        |	'//' ~[\r\n]*
  +        |	.
  +		)*?
  +		('}'|EOF)
  +	;
  +
  +fragment
  +ACTION_ESCAPE
  +		:   '\\' .
  +		;
  +
  +fragment
  +ACTION_STRING_LITERAL
  +        :	'"' (ACTION_ESCAPE | ~["\\])* '"'
  +        ;
  +
  +fragment
  +ACTION_CHAR_LITERAL
  +        :	'\'' (ACTION_ESCAPE | ~['\\])* '\''
  +        ;
  +
   // -----------------
   // Illegal Character
   //
  
positive.code: 	:	'[' {handleBeginArgAction();}
  	;
  
  BEGIN_ACTION
  	:	'{' -> more, pushMode(Action)
  	;
  
  // OPTIONS and TOKENS must also consume the opening brace that captures
  // their option block, as this is teh easiest way to parse it separate
  // to an ACTION block, despite it usingthe same {} delimiters.
  
negative.code: /*
   * [The "BSD license"]
   *  Copyright (c) 2014 Terence Parr
   *  Copyright (c) 2014 Sam Harwell
   *  All rights reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
  