anchor.diff:      ;
   
   flow
  -    :   INDENT stmts DEDENT
  +    :   INDENT statements DEDENT
       ;
   
   inline
  -    :   '{' stmt (';' stmt)* '}'
  -    ;
  -
  -stmts
  -    :   stmt ( (NL | ';') stmt)* NL*
  -    ;
  -
  -stmt
  -    :   expr
  +    :   '{' statement (';' statement)* '}'
  +    ;
  +
  +statements
  +    :   statement ( (NL | ';') statement)* NL*
  +    ;
  +
  +statement
  +    :   namespace
  +    |   block
       |   if_block
  +    |   while_block
  +    |   dowhile_block
  +    |   RETURN expression?
  +    |   PRINT expression?
  +    |   DEBUG expression?
  +    |   TRACE expression?
  +    |   expression
       ;
   
   if_block
  -    :   'if' expr block ('elsif' expr block)* ('else' block)?
  -    ;
  -
  -exprs
  -    :   expr ( (NL | ',') expr)*
  -    ;
  -
  -expr
  -    :   func
  +    :   IF expression block (ELSIF expression block)* (ELSE block)?
  +    ;
  +
  +while_block
  +    :   WHILE expression block
  +    ;
  +
  +dowhile_block
  +    :   DO block WHILE expression
  +    ;
  +
  +expressions
  +    :   expression ( (NL | ',') expression)*
  +    ;
  +
  +expression
  +    :   primary
  +    |   PRINT '(' expression ')'
  +    |   DEBUG '(' expression ')'
  +    |   TRACE '(' expression ')'
  +    |   expression '.' Identifier
  +    |   expression '[' expression ']'
  +    |   func
       |   call
  -    |   expr ('*' | '/') expr
  -    |   expr ('+' | '-') expr
  -    |   expr '..' expr
  -    |   <assoc=right> expr 'if' expr 'else' expr
  -    |   <assoc=right> expr '?' expr ':' expr
  -    |   <assoc=right> expr '=' expr
  -    |   INT
  -    |   ID
  -    |   '(' expr ')'
  +    |   expression ('++' | '--')
  +    |   ('+'|'-'|'++'|'--') expression
  +    |   ('~'|'!') expression
  +    |   expression ('*'|'/'|'%') expression
  +    |   expression ('+'|'-') expression
  +    |   expression ('<' '<' | '>' '>' '>' | '>' '>') expression
  +    |   expression ('<=' | '>=' | '>' | '<') expression
  +    |   expression 'is' type
  +    |   expression ('==' | '!=') expression
  +    |   expression '..' expression
  +    |   expression '&' expression
  +    |   expression '^' expression
  +    |   expression '|' expression
  +    |   expression '&&' expression
  +    |   expression '||' expression
  +    |   expression '?' expression ':' expression
  +    |   expression
  +        (   '='<assoc=right>
  +        |   '+='<assoc=right>
  +        |   '-='<assoc=right>
  +        |   '*='<assoc=right>
  +        |   '/='<assoc=right>
  +        |   '&='<assoc=right>
  +        |   '|='<assoc=right>
  +        |   '^='<assoc=right>
  +        |   '>>='<assoc=right>
  +        |   '>>>='<assoc=right>
  +        |   '<<='<assoc=right>
  +        |   '%='<assoc=right>
  +        )
  +        expression
  +    ;
  +
  +primary
  +    :   '(' expression ')'
  +    |   literal
  +    |   Identifier
  +    ;
  +
  +literal
  +    :   IntegerLiteral
  +    |   FloatingPointLiteral
  +    |   CharacterLiteral
  +    |   StringLiteral
  +    |   BooleanLiteral
  +    |   'null'
       ;
   
   func
  
positive.code:     ;
  
  call
      :   ID '(' params ')'
      ;
  
  params
      :   exprs?
      ;
  
  INT
      :   [1-0] [0-9]*
      ;
  
  ID  :   [a-zA-Z0-9]+
      ;
  
  WS  :   [ \t]+ -> skip
      ;
  
  NL  :   '\r'? '\n' ' '*
      ;
  
negative.code:     ;
  
  global
      :   (namespace | statements)
      ;
  
  namespace
      :   Identifier flow
      ;
  
  block
  