anchor.diff:  IS_EQ:  ' is ' -> type(EQ) ;
   IS_NEQ: ' is not ' -> type(NEQ) ;
   
  +// Bool op
  +AND:    '&&' ;
  +OR:     '||' ;
  +AND2:   ' and ' -> type(AND) ;
  +OR2:    ' or ' -> type(OR) ;
  +
   // Comparison op
   LT:     '<' ;
   GT:     '>' ;
   LTE:    '<=' ;
   GTE:    '>=' ;
   
  +// Keywords
  +IF:         'if ' ;
  +ELSE:       'elif ' ;
  +ELIF:       'else' ;
  +ENDIF:      'endif' ;
  +TRUE:       'true' ;
  +FALSE:      'false' ;
  +NULL:       'null' ;
  +
  +// Assign
  +TO:         'to' ;
  +ASSIGN:     '=' ;
  +
   // TODO complete list. Commands are built-in functions
   COMMAND:    'array' | 'TODO' ;
   SET:        'set' ;
  -TO:         'to' ;
  -ASSIGN:     '=' ;
   
   
   STRING:         '"' (ESC | ~('\u000B'))*? '"' ;
  
positive.code: 
  // ----------------------------------------------------------
  mode VineCode;
  END_OUTPUT:     '}}' -> popMode ; 
  END_STMT:       '%}' -> popMode ; 
  
  // Keywords
  IF:         'if ' ;
  ELSE:       'elif ' ;
  ELIF:       'else' ;
  ENDIF:      'endif' ;
  TRUE:       'true' ;
  FALSE:      'false' ;
  NULL:       'null' ;
  AND2:       ' and ' -> type(AND) ;
  OR2:        ' or ' -> type(OR) ;
  
  AND:        '&&' ;
  OR:         '||' ;
  DOT:        '.' ;
  COMMA:      ',' ;
  LPAREN:     '(' ;
  RPAREN:     ')' ;
  LBRACK:     '[' ;
  
negative.code: 
  //LeftBrace : '{';
  //RightBrace : '}';
  // Separators
  DOT:            '.' ;
  COMMA:          ',' ;
  
  // Unary op
  MINUS:  '-' ;
  NOT:    '!' ;
  NOT2:   'not ' -> type(NOT) ;
  POW:    '^' ; // right assoc
  
  // Arithmetic op
  MUL:    '*' ;
  DIV:    '/' ;
  ADD:    '+' ;
  