示例#1
0
 public virtual Expression VisitQuantifier(Quantifier quantifier)
 {
     if (quantifier == null) return null;
     quantifier.Comprehension = (Comprehension)this.VisitComprehension(quantifier.Comprehension);
     return quantifier;
 }
示例#2
0
 public override Expression VisitQuantifier(Quantifier quantifier) {
   if (quantifier == null) return null;
   if (quantifier.Comprehension == null) return quantifier;
   ExpressionList bindfilter = quantifier.Comprehension.BindingsAndFilters;
   for (int i = 0; i < bindfilter.Count; i++) {
     ComprehensionBinding binding = bindfilter[i] as ComprehensionBinding;
     if (binding == null)   // it's a filter
       this.VisitExpression(bindfilter[i]);
     else {   // it's a binding
       Expression sourceEnum = binding.SourceEnumerable;
       if (sourceEnum == null) continue;
       if (sourceEnum.Type == SystemTypes.Range)
         this.VisitExpression(sourceEnum);
       else {
         QuantifierBinding = true;
         this.VisitExpression(sourceEnum);
         QuantifierBinding = false;
       }
     }
   }
   ExpressionList elems = quantifier.Comprehension.Elements;
   for (int i = 0; i < elems.Count; i++)
     this.VisitExpression(elems[i]);
   return quantifier;
 }
示例#3
0
 private Expression ParseUnaryExpression(TokenSet followers){
   if (this.currentToken == Token.EndOfFile) {
     if (this.returnedEmptyIdentForEOF)
       return null;
     else {
       this.returnedEmptyIdentForEOF = true;
       return this.scanner.GetIdentifier();
     }
   }
   Expression expression;
   switch(this.currentToken){
     case Token.Plus:
     case Token.BitwiseNot:
     case Token.LogicalNot:
     case Token.Subtract:
     case Token.BitwiseAnd:
       UnaryExpression uexpr = new UnaryExpression();
       uexpr.SourceContext = this.scanner.CurrentSourceContext;
       uexpr.NodeType = Parser.ConvertToUnaryNodeType(this.currentToken);
       this.GetNextToken();
       uexpr.Operand = this.ParseUnaryExpression(followers);
       if (uexpr.Operand == null) return null;
       uexpr.SourceContext.EndPos = uexpr.Operand.SourceContext.EndPos;
       expression = uexpr;
       break;
     case Token.Multiply:
       AddressDereference adref = new AddressDereference();
       adref.SourceContext = this.scanner.CurrentSourceContext;
       adref.ExplicitOperator = AddressDereference.ExplicitOp.Star;
       this.GetNextToken();
       adref.Address = this.ParseUnaryExpression(followers);
       if (adref.Address == null) return null;
       adref.SourceContext.EndPos = adref.Address.SourceContext.EndPos;
       expression = adref;
       break;
     case Token.AddOne:
     case Token.SubtractOne:
       PrefixExpression prefixExpr = new PrefixExpression();
       prefixExpr.SourceContext = this.scanner.CurrentSourceContext;
       prefixExpr.Operator = Parser.ConvertToBinaryNodeType(this.currentToken);
       this.GetNextToken();
       prefixExpr.Expression = this.ParseUnaryExpression(followers);
       if (prefixExpr.Expression == null) return null;
       prefixExpr.SourceContext.EndPos = prefixExpr.Expression.SourceContext.EndPos;
       expression = prefixExpr;
       break;
     case Token.LeftParenthesis:
       expression = this.ParseCastExpression(followers);
       break;
     case Token.LeftBrace:
       expression = this.ParseBlockExpression(ScannerState.Code, this.scanner.CurrentSourceContext, followers);
       break;
     case Token.Exists:
     case Token.Forall:
     case Token.Count:
     case Token.Sum:
     case Token.Max:
     case Token.Min:
     case Token.Product:
       Quantifier q = new Quantifier();
       q.SourceContext = this.scanner.CurrentSourceContext;
       ScannerState ss = this.scanner.state;
       Token quantType = this.currentToken;
       SourceContext sctx = this.scanner.CurrentSourceContext;
       this.GetNextToken();
       if (this.currentToken == Token.Unique){
         quantType = this.currentToken;
         this.GetNextToken();
       }
       // not necessarily a quantifier unless there is an open curly!!
       // REVIEW: Is that enough of a test? Or do we need to try parsing the comprehension?
       if (this.currentToken != Token.LeftBrace) {
         //Restore prior state and reparse as expression
         this.scanner.endPos = q.SourceContext.StartPos;
         this.scanner.state = ss;
         this.currentToken = Token.None;
         this.GetNextToken();
         goto default;
       }
       q.QuantifierType = Parser.ConvertToQuantifierType(quantType);
       this.Skip(Token.LeftBrace);
       Comprehension c = this.ParseComprehension(followers, sctx);
       if (c == null) {
         return null;
       }
       q.Comprehension = c;
       q.SourceContext.EndPos = c.SourceContext.EndPos;
       expression = q;
       break;
     default:
       expression = this.ParsePrimaryExpression(followers);
       break;
   }
   return expression;
 }
示例#4
0
 public override Expression VisitQuantifier(Quantifier quantifier)
 {
     if (quantifier == null) return null;
     return base.VisitQuantifier((Quantifier)quantifier.Clone());
 }
 public EventingVisitor(Action<Quantifier> visitQuantifier) { VisitedQuantifier += visitQuantifier; } public event Action<Quantifier> VisitedQuantifier; public override Expression VisitQuantifier(Quantifier quantifier) { if (VisitedQuantifier != null) VisitedQuantifier(quantifier); return base.VisitQuantifier(quantifier); }