anchor.diff:      ;
   // expressions
   expression
  -    : expression logic
  -    | expression arithBit
  -    | expression arithShift
  -    | expression arithRange
  -    | expression arithAdd
  -    | expression arithMul
  -    | expression DOT call
  -    | expression IS expression
  +    : expression compoundExpression
       | BANG expression
       | LPAREN expression  RPAREN
  -    | expression elvis
       | atomExpression
       ;
  +
  +compoundExpression
  +     : logic
  +     | arithBit
  +     | arithShift
  +     | arithRange
  +     | arithAdd
  +     | arithMul
  +     | DOT call
  +     | IS expression
  +     | elvis
  +     ;
  +
   atomExpression
       : id
  -    | bool
  -    | char
  -    | string
  -    | num
  -    | null
  +    | boolE
  +    | charE
  +    | stringE
  +    | numE
  +    | nullE
       | listInit
       | mapInit
       | call
  
positive.code: 
  
  // flow
  if: ifCond bodyFlow elseIf* else?;
  ifCond: IF LPAREN expression RPAREN;
  elseIf: ELSE ifCond bodyFlow;
  else : ELSE bodyFlow;
  
  while: WHILE LPAREN (expression | assignment) RPAREN bodyFlow;
  for: FOR LPAREN id IN expression RPAREN bodyFlow;
  
  bodyFlow
      : block
  
negative.code: 
  // primitives
  id: IDENTIFIER;
  boolE: TRUE | FALSE ;
  charE: CHAR_LITERAL;
  stringE: STRING_LITERAL | TEXT_BLOCK ;
  numE
      : DECIMAL_LITERAL
      | HEX_LITERAL
      | FLOAT_LITERAL
      | HEX_FLOAT_LITERAL
      ;
  nullE: NULL;
  