anchor.diff:     | macroInvocationSemi
      ;
   
  -letStatement
  -   : outerAttribute* 'let' pattern (':' type)?
  -   (
  -      '=' expression
  -   )? ';'
  -   ;
  -expressionStatement
  -   : expressionWithoutBlock ';'
  -   | expressionWithBlock ';'?
  -   ;
  +letStatement: outerAttribute* 'let' pattern (':' type)? ( '=' expression)? ';';
  +
  +expressionStatement: expression ';'?;
   expression
  -   : expressionWithoutBlock
  -   | expressionWithBlock
  -   ;
  -
  -expressionWithoutBlock
  -   : outerAttribute*
  -   (
  -      literalExpression
  -      | pathExpression
  -      | operatorExpression
  -      | groupedExpression
  -      | arrayExpression
  -      | awaitExpression
  -      | indexExpression
  -      | tupleExpression
  -      | tupleIndexingExpression
  -      | structExpression
  -      | enumerationVariantExpression
  -      | callExpression
  -      | methodCallExpression
  -      | fieldExpression
  -      | closureExpression
  -      | continueExpression
  -      | breakExpression
  -      | rangeExpression
  -      | returnExpression
  -      | macroInvocation
  -   )
  -   ;
  +   : outerAttribute+ expression                                                          # AttributedExpression // technical, remove left recursive
  +   | literalExpression                                                                   # LiteralExpression_
  +   | pathExpression                                                                      # PathExpression_
  +   | ('&' | '&&') 'mut'? expression                                                      # BorrowExpression
  +   | '*' expression                                                                      # DereferenceExpression
  +   | expression '?'                                                                      # ErrorPropagationExpression
  +   | ('-' | '!') expression                                                              # NegationExpression
  +   | expression ('+' | '-' | '*' | '/' | '%' | '&' | '|' | '^' | '<<' | '>>') expression # ArithmeticOrLogicalExpression
  +   | expression ('==' | '!=' | '>' | '<' | '>=' | '<=') expression                       # ComparisonExpression
  +   | expression ('||' | '&&') expression                                                 # LazyBooleanExpression
  +   | expression 'as' expression                                                          # TypeCastExpression
  +   | expression '=' expression                                                           # AssignmentExpression
  +   | expression
  +   (
  +      '+='
  +      | '-='
  +      | '*='
  +      | '/='
  +      | '%='
  +      | '&='
  +      | '|='
  +      | '^='
  +      | '<<='
  +      | '>>='
  +   ) expression                                         # CompoundAssignmentExpression
  +   | '(' innerAttribute* expression ')'                 # GroupedExpression
  +   | '[' innerAttribute* arrayElements? ']'             # ArrayExpression
  +   | expression '.' 'await'                             # AwaitExpression
  +   | expression '[' expression ']'                      # IndexExpression
  +   | '(' innerAttribute* tupleElements? ')'             # TupleExpression
  +   | expression '.' tupleIndex                          # TupleIndexingExpression
  +   | structExpression                                   # StructExpression_
  +   | enumerationVariantExpression                       # EnumerationVariantExpression_
  +   | expression '(' callParams? ')'                     # CallExpression
  +   | expression '.' pathExprSegment '(' callParams? ')' # MethodCallExpression
  +   | expression '.' identifier                          # FieldExpression
  +   | closureExpression                                  # ClosureExpression_
  +   | 'continue' LIFETIME_OR_LABEL? expression?          # ContinueExpression
  +   | 'break' LIFETIME_OR_LABEL? expression?             # BreakExpression
  +   | expression '..' expression?                        # RangeExpression
  +   | '..' expression?                                   # RangeExpression
  +   | '..=' expression                                   # RangeExpression
  +   | expression '..=' expression                        # RangeExpression
  +   | 'return' expression?                               # ReturnExpression
  +   | macroInvocation                                    # MacroInvocationAsExpression
  +   | expressionWithBlock                                # ExpressionWithBlock_
  +   ;
  +
   expressionWithBlock
  -   : outerAttribute*
  -   (
  -      blockExpression
  -      | asyncBlockExpression
  -      | unsafeBlockExpression
  -      | loopExpression
  -      | ifExpression
  -      | ifLetExpression
  -      | matchExpression
  -   )
  +   : blockExpression
  +   | asyncBlockExpression
  +   | unsafeBlockExpression
  +   | loopExpression
  +   | ifExpression
  +   | ifLetExpression
  +   | matchExpression
      ;
   
   literalExpression
  
positive.code:    | simplePath '!' '{' tokenTree* '}'
     ;
  
  macroRulesDefinition
     : 'macro_rules' '!' identifier macroRulesDef
     ;
  
  macroRulesDef
     : '(' macroRules ')' ';'
  
negative.code:       | macroInvocationSemi
     )
     ;
  traitFunc: traitFunctionDecl (';' | blockExpression);
  traitMethod: traitMethodDecl (';' | blockExpression);
  traitFunctionDecl
     : functionQualifiers 'fn' identifier generics? '(' traitFunctionParameters? ')' functionReturnType? whereClause?
     ;
  traitMethodDecl
     : functionQualifiers 'fn' identifier generics? '(' selfParam
  