anchor.diff:  // Lexer rules
   
   DATA            : 'data';
  -FUNCTION        : 'fn';
  +FN              : 'fn';
   RULE            : 'rule';
  -DISPATCH        : 'dispatch';
  -
  +AS              : 'as';
   COLON           : ':';
   ARROW           : '→';
   FORALL          : '∀';
   LPAR            : '(';
   RPAR            : ')';
  -LSQUARE         : '[';
  -RSQUARE         : ']';
  +LCURLY          : '}';
  +RCURLY          : '}';
   SEMI            : ';';
  -COMMA           : ',';
  -DATASORT        : '::=';
  -COLONCOLON      : '::';
  +COMMA           : ',';  
   DOT             : '.';
  -NOT             : '¬';
  -LINEAR          : '¹';
  -FUNCTIONVAR     : 'ᵇ';
  -DATAVAR         : 'ᵇ';
  +NOT             : '¬'; 
  +FUNCTIONAL      : 'ˢ';    
   
  -CONSTRUCTOR     : StartConstructorChar ConstructorChar* Ebnf?; // '$' is for internal use only.
  +// -- Common lexing rules with Crsx.g4.
  +//    Cannot extract these rules yet as the antlr meta parser generator does not support modular grammars yet 
   
  +CONSTRUCTOR     : StartConstructorChar ConstructorChar* // '$' is for internal use only.
  +                | '<' [Other] ConstructorChar*;
   VARIABLE        : Lower (Lower | Digit | '-' | '_')*;
   
  -METAVAR         : '#' (Alpha | Digit | Other | Unicode)* Ebnf? Digit*; // '$' is for internal use only
  +METAVAR         : '#' (Alpha | Digit | '-' | '_' | Unicode)* Ebnf? Digit*; // '$' is for internal use only
   
   STRING          :  '"' ('\\"'|~'"')* '"';
   
   NUMBER          : Decimal;
   
  -fragment StartConstructorChar : Upper | Other | [\u00C0-\u00DE] | '\u0100' | '\u0102' | '\u0104' | '\u0106'; // TODO: all upper cases
  +fragment StartConstructorChar : Upper | Other | UnicodeS;
   fragment ConstructorChar      : Alpha | Digit | Other | Unicode;
   
  -fragment Digit   : [0-9];
  -fragment Upper   : [A-Z];
  -fragment Lower   : [a-z];
  -fragment Alpha   : [a-zA-Z];
  -fragment Decimal : '-'? [0-9]+ ('.' [0-9]+)? | '.' [0-9]+;
  -fragment Other   : '-' | '$' | '_'; // TODO: remove '-'
  -fragment Unicode : ~[\u0000-\u00FF\uD800-\uDBFF] | [\uD800-\uDBFF] [\uDC00-\uDFFF];
  -fragment Ebnf    : '*' | '?' | '+';
  +fragment Digit    : [0-9];
  +fragment Upper    : [A-Z];
  +fragment Lower    : [a-z];
  +fragment Alpha    : [a-zA-Z];
  +fragment Decimal  : '-'? [0-9]+ ('.' [0-9]+)? | '.' [0-9]+;
  +fragment Other    : '-' | [$_+/|`~!@^&*=?/>.:];
  +fragment Unicode  : ~[\u0000-\u00FF\uD800-\uDBFF] | [\uD800-\uDBFF] [\uDC00-\uDFFF];
  +fragment UnicodeS : ~[\u0000-\u00FF\uD800-\uDBFF\u27e6\u27e7\u27e8\u27e9] | [\uD800-\uDBFF] [\uDC00-\uDFFF];
  +fragment Ebnf     : '*' | '?' | '+';
   
   WS               : [ \t\r\n\f]+ -> channel(HIDDEN) ;
   
   BLOCK_COMMENT    : '/*' .*? ('*/' | EOF)    -> channel(HIDDEN);
  +LINE_COMMENT     : '//' ~[\r\n]*            -> channel(HIDDEN);
positive.code:     | NUMBER                                             /* Number literal */
      ;
  
  csort
      : COLONCOLON csortname;                              /* Sort annotation */
  
  cdispatchCases
      : cterm (SEMI cterm)*                                /* Dispatch cases */
      ;
  
  clist
      : LPAR term* RPAR                                    /* List of term */
      | LPAR ckv* RPAR                                     /* List of key-value pair */
      ;
  
  ckv
  
negative.code:     | STRING COLON cterm                                 /* match named property value / construct    */
      ;
  
  cterms
      : cterm (COMMA cterm)*                               /* Term list */
      ;
      
  cconstructor
      : CONSTRUCTOR
      | COLON
  