protected Expression typeof_with_expression()
 {
     Expression expression = null;
     IToken token = null;
     try
     {
         Expression expression2;
         token = this.LT(1);
         this.match(0x2c);
         if ((this.LA(1) == 0x3f) && tokenSet_16_.member(this.LA(2)))
         {
             this.match(0x3f);
             expression2 = this.expression();
             this.match(0x40);
         }
         else
         {
             if (!tokenSet_16_.member(this.LA(1)) || !tokenSet_20_.member(this.LA(2)))
             {
                 throw new NoViableAltException(this.LT(1), this.getFilename());
             }
             expression2 = this.expression();
         }
         if (base.inputState.guessing == 0)
         {
             ReferenceExpression expression4;
             MethodInvocationExpression expression3 = new MethodInvocationExpression(ToLexicalInfo(token));
             ReferenceExpression expression1 = expression4 = new ReferenceExpression(ToLexicalInfo(token));
             expression4.set_Name(token.getText());
             expression3.set_Target(expression4);
             expression3.get_Arguments().Add(expression2);
             expression = expression3;
         }
     }
     catch (RecognitionException exception)
     {
         if (base.inputState.guessing != 0)
         {
             throw;
         }
         this.reportError(exception);
         this.recover(exception, tokenSet_20_);
         return expression;
     }
     return expression;
 }
 public Expression new_expression()
 {
     Expression expression = null;
     try
     {
         ExpressionCollection expressions;
         bool flag = false;
         if ((this.LA(1) == 0x1b) && (this.LA(2) == 0x3b))
         {
             int num = this.mark();
             flag = true;
             base.inputState.guessing++;
             try
             {
                 this.new_array_expression();
             }
             catch (RecognitionException)
             {
                 flag = false;
             }
             this.rewind(num);
             base.inputState.guessing--;
         }
         if (flag)
         {
             return this.new_array_expression();
         }
         if ((this.LA(1) != 0x1b) || ((this.LA(2) != 12) && (this.LA(2) != 0x3b)))
         {
             throw new NoViableAltException(this.LT(1), this.getFilename());
         }
         this.match(0x1b);
         Expression expression2 = this.reference_expression();
         if (base.inputState.guessing == 0)
         {
             MethodInvocationExpression expression3;
             MethodInvocationExpression expression4;
             MethodInvocationExpression expression1 = expression3 = new MethodInvocationExpression(expression2.get_LexicalInfo());
             expression3.set_Target(expression2);
             expression = expression4 = expression3;
             expressions = expression4.get_Arguments();
         }
         this.match(0x3f);
         this.expression_list(expressions);
         this.match(0x40);
         return expression;
     }
     catch (RecognitionException exception2)
     {
         if (base.inputState.guessing != 0)
         {
             throw;
         }
         this.reportError(exception2);
         this.recover(exception2, tokenSet_20_);
         return expression;
     }
     return expression;
 }
 public Expression slicing_expression()
 {
     Expression target = null;
     IToken token = null;
     IToken token2 = null;
     SlicingExpression se = null;
     MethodInvocationExpression expression3 = null;
     ExpressionCollection ec = null;
     try
     {
         target = this.atom();
         while (true)
         {
             while ((this.LA(1) == 0x44) && tokenSet_54_.member(this.LA(2)))
             {
                 token = this.LT(1);
                 this.match(0x44);
                 if (base.inputState.guessing == 0)
                 {
                     se = new SlicingExpression(ToLexicalInfo(token));
                     se.set_Target(target);
                     target = se;
                 }
                 this.slice(se);
                 while (this.LA(1) == 0x43)
                 {
                     this.match(0x43);
                     this.slice(se);
                 }
                 this.match(0x45);
             }
             if ((this.LA(1) == 0x41) && tokenSet_55_.member(this.LA(2)))
             {
                 this.match(0x41);
                 target = this.member_reference_expression(target);
             }
             else
             {
                 if ((this.LA(1) != 0x3f) || !tokenSet_22_.member(this.LA(2)))
                 {
                     return target;
                 }
                 token2 = this.LT(1);
                 this.match(0x3f);
                 if (base.inputState.guessing == 0)
                 {
                     expression3 = new MethodInvocationExpression(ToLexicalInfo(token2));
                     expression3.set_Target(target);
                     target = expression3;
                     ec = expression3.get_Arguments();
                 }
                 this.expression_list(ec);
                 this.match(0x40);
             }
         }
     }
     catch (RecognitionException exception)
     {
         if (base.inputState.guessing != 0)
         {
             throw;
         }
         this.reportError(exception);
         this.recover(exception, tokenSet_20_);
         return target;
     }
     return target;
 }
 private void ProcessTypeofBuiltin(MethodInvocationExpression node)
 {
     if (node.get_Arguments().get_Count() != 1)
     {
         this.Error(node, new CompilerError("UCE0001", node.get_Target().get_LexicalInfo(), "'typeof' takes a single argument.", null));
     }
     else
     {
         IType type = node.get_Arguments().get_Item(0).get_Entity() as IType;
         if (type != null)
         {
             node.get_ParentNode().Replace(node, this.get_CodeBuilder().CreateTypeofExpression(type));
         }
         else
         {
             node.set_Target(this.get_CodeBuilder().CreateReference(this._UnityRuntimeServices_GetTypeOf));
             this.BindExpressionType(node, this.get_TypeSystemServices().TypeType);
         }
     }
 }