anchor.diff:  // 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 {}.
  -
  -mode Action;
  -
  -	NESTED_ACTION			: LBrace			-> type(ACTION_CONTENT), pushMode(Action)	;
  -
  -	ACTION_ESCAPE			: EscAny			-> type(ACTION_CONTENT)		;
  -
  -	ACTION_STRING_LITERAL	: DQuoteLiteral		-> type(ACTION_CONTENT)		;
  -	ACTION_CHAR_LITERAL		: SQuoteLiteral		-> type(ACTION_CONTENT)		;
  -
  -	ACTION_DOC_COMMENT		: DocComment		-> type(ACTION_CONTENT)		;
  -	ACTION_BLOCK_COMMENT	: BlockComment 		-> type(ACTION_CONTENT)		;
  -	ACTION_LINE_COMMENT		: LineComment 		-> type(ACTION_CONTENT)		;
  -
  -	END_ACTION				: RBrace	{ self.handleEndAction() }	;
  -
  -	UNTERMINATED_ACTION		: EOF		-> popMode		;
  -
  -	ACTION_CONTENT			: .							;
  -
  -
  -// -------------------------
  -
  -mode Options;
  -
  -	OPT_DOC_COMMENT		: DocComment		-> type(DOC_COMMENT), channel(OFF_CHANNEL)		;
  -	OPT_BLOCK_COMMENT	: BlockComment 		-> type(BLOCK_COMMENT), channel(OFF_CHANNEL)	;
  -	OPT_LINE_COMMENT	: LineComment 		-> type(LINE_COMMENT), channel(OFF_CHANNEL)		;
  -
  -	OPT_LBRACE			: LBrace			-> type(LBRACE)				;
  -	OPT_RBRACE			: RBrace			-> type(RBRACE), popMode	;
  -
  -	OPT_ID				: Id				-> type(ID)					;
  -	OPT_DOT				: Dot				-> type(DOT)				;
  -	OPT_ASSIGN			: Equal				-> type(ASSIGN)				;
  -	OPT_STRING_LITERAL	: SQuoteLiteral		-> type(STRING_LITERAL)		;
  -	OPT_INT				: DecimalNumeral	-> type(INT)				;
  -	OPT_STAR			: Star				-> type(STAR)				;
  -	OPT_SEMI			: Semi				-> type(SEMI)				;
  -
  -	OPT_WS				: Ws+	-> type(WS), channel(OFF_CHANNEL) 	;
  -
  -
  -// -------------------------
  -
  -mode Tokens;
  -
  -	TOK_DOC_COMMENT		: DocComment		-> type(DOC_COMMENT), channel(OFF_CHANNEL)		;
  -	TOK_BLOCK_COMMENT	: BlockComment 		-> type(BLOCK_COMMENT), channel(OFF_CHANNEL)	;
  -	TOK_LINE_COMMENT	: LineComment 		-> type(LINE_COMMENT), channel(OFF_CHANNEL)		;
  -
  -	TOK_LBRACE			: LBrace			-> type(LBRACE)				;
  -	TOK_RBRACE			: RBrace			-> type(RBRACE), popMode	;
  -
  -	TOK_ID				: Id				-> type(ID)					;
  -	TOK_DOT				: Dot				-> type(DOT)				;
  -	TOK_COMMA			: Comma				-> type(COMMA)				;
  -
  -	TOK_WS				: Ws+	-> type(WS), channel(OFF_CHANNEL) 	;
  -
  -
  -// -------------------------
  -
  -mode Channels;	// currently same as Tokens mode; distinguished by keyword
  -
  -	CHN_DOC_COMMENT		: DocComment		-> type(DOC_COMMENT), channel(OFF_CHANNEL)		;
  -	CHN_BLOCK_COMMENT	: BlockComment 		-> type(BLOCK_COMMENT), channel(OFF_CHANNEL)	;
  -	CHN_LINE_COMMENT	: LineComment 		-> type(LINE_COMMENT), channel(OFF_CHANNEL)		;
  -
  -	CHN_LBRACE			: LBrace			-> type(LBRACE)				;
  -	CHN_RBRACE			: RBrace			-> type(RBRACE), popMode	;
  -
  -	CHN_ID				: Id				-> type(ID)					;
  -	CHN_DOT				: Dot				-> type(DOT)				;
  -	CHN_COMMA			: Comma				-> type(COMMA)				;
  -
  -	CHN_WS				: Ws+	-> type(WS), channel(OFF_CHANNEL) 	;
  -
  -
  -// -------------------------
  -
  +mode TargetLanguageAction;
  +NESTED_ACTION
  +   : LBrace -> type (ACTION_CONTENT) , pushMode (TargetLanguageAction)
  +   ;
  +
  +ACTION_ESCAPE
  +   : EscAny -> type (ACTION_CONTENT)
  +   ;
  +
  +ACTION_STRING_LITERAL
  +   : DQuoteLiteral -> type (ACTION_CONTENT)
  +   ;
  +
  +ACTION_CHAR_LITERAL
  +   : SQuoteLiteral -> type (ACTION_CONTENT)
  +   ;
  +
  +ACTION_DOC_COMMENT
  +   : DocComment -> type (ACTION_CONTENT)
  +   ;
  +
  +ACTION_BLOCK_COMMENT
  +   : BlockComment -> type (ACTION_CONTENT)
  +   ;
  +
  +ACTION_LINE_COMMENT
  +   : LineComment -> type (ACTION_CONTENT)
  +   ;
  +
  +END_ACTION
  +   : RBrace
  +   { self.handleEndAction() }
  +   ;
  +
  +UNTERMINATED_ACTION
  +   : EOF -> popMode
  +   ;
  +
  +ACTION_CONTENT
  +   : .
  +   ;
  +
  +// -------------------------
   mode LexerCharSet;
  -
  -	LEXER_CHAR_SET_BODY
  -		:	(	~[\]\\]
  -			|	EscAny
  -			)+				-> more
  -		;
  -
  -	LEXER_CHAR_SET
  -		:	RBrack			-> popMode
  -		;
  -
  -	UNTERMINATED_CHAR_SET
  -		:	EOF				-> popMode
  -		;
  -
  +LEXER_CHAR_SET_BODY
  +   : (~ [\]\\] | EscAny)+ -> more
  +   ;
  +
  +LEXER_CHAR_SET
  +   : RBrack -> popMode
  +   ;
  +
  +UNTERMINATED_CHAR_SET
  +   : EOF -> popMode
  +   ;
   
   // ------------------------------------------------------------------------------
   // Grammar specific Keywords, Punctuation, etc.
  -
  -fragment Id	: NameStartChar NameChar*	;
  -
  +fragment Id
  +   : NameStartChar NameChar*
  +   ;
  +   
  
positive.code:  *	-- update for compatibility with Antlr v4.5
   */
  
  lexer grammar ANTLRv4LexerPythonTarget;
  
  options {
  	superClass = LexerAdaptor ;
  }
  
  import LexBasic;	// Standard set of fragments
  
  @header {
  //from LexerAdaptor import LexerAdaptor
  }
  
  tokens {
  	TOKEN_REF,
  	RULE_REF,
  	LEXER_CHAR_SET
  }
  
  channels {
  	OFF_CHANNEL		// non-default channel for whitespace and comments
  }
  
  
  // ======================================================
  // Lexer specification
  //
  
  // -------------------------
  // Comments
  
  DOC_COMMENT
  	:	DocComment
  	;
  
  BLOCK_COMMENT
  	:	BlockComment	-> channel(OFF_CHANNEL)
  	;
  
  LINE_COMMENT
  	:	LineComment		-> channel(OFF_CHANNEL)
  	;
  
  
  // -------------------------
  // Integer
  //
  
  INT	: DecimalNumeral
  	;
  
  
  // -------------------------
  // Literal string
  
negative.code:  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  /**
   *	A grammar for ANTLR v4 implemented using v4 syntax
   *
  