anchor.diff:    ;
   
   typeargs
  -  : '[' type (',' type)* ']'
  +  : '[' (type | literal | ('#' postfix)) (',' (type | literal | ('#' postfix)))* ']'
  +  ;
  +
  +literal
  +  : 'true'
  +  | 'false'
  +  | INT
  +  | FLOAT
  +  | STRING
     ;
   
   typeparams
  -  : ('[' | LSQUARE_NEW) typeparam (',' typeparam)* ']'
  +  : ('[' | LSQUARE_NEW) (typeparam | typeparamvalue) (',' (typeparam | typeparamvalue))* ']'
     ;
   
   params
     : (param | '...') (',' (param | '...'))*
  +  ;
  +
  +typeparamvalue
  +  : 'let' ID (':' type)? ('=' infix)?
     ;
   
   typeparam
  
positive.code: 
  atom
    : ID
    | literal
    | ('(' | LPAREN_NEW) (rawseq | '_') tuple? ')'
    | ('[' | LSQUARE_NEW) ('as' type ':')? rawseq (',' rawseq)* ']'
  
negative.code: 
  nextatom
    : ID
    | 'this'
    | literal
    | LPAREN_NEW (rawseq | '_') tuple? ')'
    | LSQUARE_NEW ('as' type ':')? rawseq (',' rawseq)* ']'
  