anchor.diff:  literal
       : NullLiteral
       | BooleanLiteral
  -    | tjsStringLiteral
  +    | (StringLiteral | TemplateStringLiteral)+
       | octetLiteral
       | RegularExpressionLiteral
       | numericLiteral
  -    ;
  -
  -tjsStringLiteral // tjs can use C like string literal: "part1""part2"
  -    : (StringLiteral
  -    | TemplateStringLiteral)+
  +    | Void
       ;
   
   octetLiteral
  
positive.code:     ;
  
  functionParameter
      : Identifier ('=' singleExpression)?      // TJS2, ECMAScript 6: Initialization
      | Identifier? '*'
      ;
  
  arrayLiteral
      : varModifier? '[' ','* elementList? ','* ']'
      ;
  
  elementList
      : arrayElement ((','|'=>')+ arrayElement)*
      ;
  
  arrayElement
      : singleExpression
      ;
  
  objectLiteral
      : varModifier? '%[' propertyAssignment? (',' propertyAssignment)* ','?']'
      ;
  
  propertySeprator
      : ':' |'=' | '=>' | ','
      ;
  
  propertyAssignment
      : singleExpression propertySeprator singleExpression // TJS resolve object key in runtime
      ;
  
  arguments
      : '(' tjsArgument? (',' tjsArgument?)* ')'
      | '(' ( Ellipsis | '*') ')' // ... means use argument (JS function argument)
      ;
  
  tjsArgument // In TJS, argument can expanded by using *
      : singleExpression '*'?
      | '*'
      ;
  
  expressionSequence
      : singleExpression (',' singleExpression)*
      ;
  
  // TODO: optimize this
  singleExpression
      : functionDeclaration                                                       # FunctionExpression
      | singleExpression '[' expressionSequence ']'                               # MemberIndexExpression
      | singleExpression '.' identifierName                                       # MemberDotExpression
      | singleExpression arguments                                                # ArgumentsExpression
      | New singleExpression arguments?                                           # NewExpression
      | singleExpression '++'                                                     # PostIncrementExpression
      | singleExpression '--'                                                     # PostDecreaseExpression
      | Delete singleExpression                                                   # DeleteExpression
      | Void singleExpression?                                                    # VoidExpression
      | Typeof singleExpression                                                   # TypeofExpression
      | '++' singleExpression                                                     # PreIncrementExpression
      | '--' singleExpression                                                     # PreDecreaseExpression
      | '+' singleExpression                                                      # UnaryPlusExpression
      | '-' singleExpression                                                      # UnaryMinusExpression
      | '~' singleExpression                                                      # BitNotExpression
      | '!' singleExpression                                                      # NotExpression
      | singleExpression '!'                                                      # EvalExpression
      | singleExpression ('*' | '/' | '%' | '\\') singleExpression                # MultiplicativeExpression
      | singleExpression ('+' | '-') singleExpression                             # AdditiveExpression
      | singleExpression ('<<' | '>>' | '>>>') singleExpression                   # BitShiftExpression
      | singleExpression ('<' | '>' | '<=' | '>=') singleExpression               # RelationalExpression
      | singleExpression Instanceof singleExpression                              # InstanceofExpression
      | singleExpression In singleExpression                                      # InExpression
      | singleExpression ('==' | '!=' | '===' | '!==') singleExpression           # EqualityExpression
      | singleExpression '&' singleExpression                                     # BitAndExpression
      | singleExpression '^' singleExpression                                     # BitXOrExpression
      | singleExpression '|' singleExpression                                     # BitOrExpression
      | singleExpression '&&' singleExpression                                    # LogicalAndExpression
      | singleExpression '||' singleExpression                                    # LogicalOrExpression
      | singleExpression '?' singleExpression ':' singleExpression                # TernaryExpression
      | singleExpression '=' singleExpression                                     # AssignmentExpression
      | singleExpression '<->' singleExpression                                   # SwapExpression
      | singleExpression assignmentOperator singleExpression                      # AssignmentOperatorExpression
      | singleExpression TemplateStringLiteral+                                   # TemplateStringExpression  // ECMAScript 6, TJS has simillar feature
      | This                                                                      # ThisExpression
      | Identifier                                                                # IdentifierExpression
      | Super                                                                     # SuperExpression
      | typeConverter singleExpression                                            # TypeConvertExpression
      | literal                                                                   # LiteralExpression
      | arrayLiteral                                                              # ArrayLiteralExpression
      | objectLiteral                                                             # ObjectLiteralExpression
      | '(' expressionSequence ')'                                                # ParenthesizedExpression
      | singleExpression Incontextof singleExpression                             # InContextOfExpression
      | singleExpression If singleExpression                                      # TJSIfExpression
      | Invalidate (('(' identifierName ')') |identifierName)                     # InvalidateExpression
      | '&' singleExpression                                                      # TJSRefExpression
      | '*' singleExpression                                                      # TJSPtrExpression
      | '.' identifierName                                                        # WithDotExpression
      | singleExpression Isvalid                                                  # IsValidExpression
      | Isvalid singleExpression                                                  # IsValidExpression
      ;
  
  assignmentOperator
  
negative.code:     ;
  
  variableStatement
      : varModifier variableDeclarations eos
      ;
  
  variableDeclarations
      : variableDeclaration (',' variableDeclaration)*
      ;
  
  variableDeclaration
      : Identifier ('=' expression)?
      ;
  
  emptyStatement
  