Esempio n. 1
0
 public virtual ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding)
 {
     if (comprehensionBinding == null) return null;
     comprehensionBinding.TargetVariableType = this.VisitTypeReference(comprehensionBinding.TargetVariableType);
     comprehensionBinding.TargetVariable = this.VisitTargetExpression(comprehensionBinding.TargetVariable);
     comprehensionBinding.AsTargetVariableType = this.VisitTypeReference(comprehensionBinding.AsTargetVariableType);
     comprehensionBinding.SourceEnumerable = this.VisitExpression(comprehensionBinding.SourceEnumerable);
     return comprehensionBinding;
 }
Esempio n. 2
0
    private Expression ParseIteratorOrExpression( TokenSet followers ) {
      SourceContext sctx = this.scanner.CurrentSourceContext;
      ScannerState ss = this.scanner.state;
      // shortcut for ( <expression>)
      if( this.currentToken == Token.LeftParenthesis ) {
        // then it can't be a binding, it must be a filter.
        Expression e = ParseExpression(followers );
        e.SourceContext = sctx;
        e.SourceContext.EndPos = this.scanner.CurrentSourceContext.StartPos;
        return e;
      }
      // try fully formed syntax:  <type> <name> in <expression>
      ComprehensionBinding q = new ComprehensionBinding();
      q.TargetVariableType = q.TargetVariableTypeExpression = this.ParseTypeExpression(null,
        followers | Parser.IdentifierOrNonReservedKeyword |Token.In|Token.RightBrace|Token.Semicolon|Token.Comma, true );
      if (q.TargetVariableType != null && Parser.IdentifierOrNonReservedKeyword[this.currentToken] ) {
        q.TargetVariable = this.scanner.GetIdentifier();
        q.SourceContext = this.scanner.CurrentSourceContext;
        this.SkipIdentifierOrNonReservedKeyword();
        // after the identifier, look for 'in' keyword
        if( this.currentToken == Token.In ) {
          this.Skip(Token.In);
          q.SourceEnumerable = this.ParseExpression(followers);
          q.SourceContext = sctx;
          q.SourceContext.EndPos = this.scanner.CurrentSourceContext.StartPos;
          return q;
        }


      }
      // back up and try as untyped iterator:  <name> in <expression>
      q.TargetVariableType = q.TargetVariableTypeExpression = null;
      this.scanner.endPos = sctx.StartPos;
      this.scanner.state = ss;
      this.currentToken = Token.None;
      this.GetNextToken();
      if (Parser.IdentifierOrNonReservedKeyword[this.currentToken] ) {
        q.TargetVariable = this.scanner.GetIdentifier();
        q.SourceContext = this.scanner.CurrentSourceContext;
        this.SkipIdentifierOrNonReservedKeyword();
        // after the identifier, look for 'in' keyword
        if( this.currentToken == Token.In ) {
          this.Skip(Token.In);
          q.SourceEnumerable = this.ParseExpression(followers);
          return q;
        } else if (this.currentToken == Token.As) {
          this.Skip(Token.As);
          q.AsTargetVariableType = q.AsTargetVariableTypeExpression = this.ParseTypeExpression(null,
            followers|Token.In|Token.RightBrace|Token.Semicolon|Token.Comma, false);
          this.Skip(Token.In);
          q.SourceEnumerable = this.ParseExpression(followers);
          return q;
        }
      }
      // back up and try as unnamed expression:  <expression>
      this.scanner.endPos = sctx.StartPos;
      this.scanner.state = ss;
      this.currentToken = Token.None;
      this.GetNextToken();
      return  this.ParseExpression(followers);
    }
Esempio n. 3
0
 public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding)
 {
     if (comprehensionBinding == null) return null;
     return base.VisitComprehensionBinding((ComprehensionBinding)comprehensionBinding.Clone());
 }
 public EventingVisitor(Action<ComprehensionBinding> visitComprehensionBinding) { VisitedComprehensionBinding += visitComprehensionBinding; } public event Action<ComprehensionBinding> VisitedComprehensionBinding; public override ComprehensionBinding VisitComprehensionBinding(ComprehensionBinding comprehensionBinding) { if (VisitedComprehensionBinding != null) VisitedComprehensionBinding(comprehensionBinding); return base.VisitComprehensionBinding(comprehensionBinding); }