public ExpressionNode BuildExpression(bool enableValidation) { ExpressionNode pathRoot = null; ExpressionNode path = null; foreach (var element in _elements) { ExpressionNode node = null; switch (element) { case NotExpressionPathElement _: node = new LogicalNotNode(); break; case PropertyElement prop: node = new PropertyAccessorNode(prop.Property.Name, enableValidation, new PropertyInfoAccessorPlugin(prop.Property, prop.AccessorFactory)); break; case ArrayElementPathElement arr: node = new PropertyAccessorNode(CommonPropertyNames.IndexerName, enableValidation, new ArrayElementPlugin(arr.Indices, arr.ElementType)); break; case VisualAncestorPathElement visualAncestor: node = new FindVisualAncestorNode(visualAncestor.AncestorType, visualAncestor.Level); break; case AncestorPathElement ancestor: node = new FindAncestorNode(ancestor.AncestorType, ancestor.Level); break; case SelfPathElement _: node = new SelfNode(); break; case ElementNameElement name: node = new ElementNameNode(name.NameScope, name.Name); break; case IStronglyTypedStreamElement stream: node = new StreamNode(stream.CreatePlugin()); break; case ITypeCastElement typeCast: node = new StrongTypeCastNode(typeCast.Type, typeCast.Cast); break; default: throw new InvalidOperationException($"Unknown binding path element type {element.GetType().FullName}"); } path = pathRoot is null ? (pathRoot = node) : path.Next = node; } return(pathRoot ?? new EmptyExpressionNode()); }
public virtual XzaarExpression Visit(LogicalNotNode node) { return(null); }
public (ExpressionNode?Node, SourceMode Mode) Parse(ref CharacterReader r) { ExpressionNode?rootNode = null; ExpressionNode?node = null; var(astNodes, mode) = BindingExpressionGrammar.Parse(ref r); foreach (var astNode in astNodes) { ExpressionNode?nextNode = null; switch (astNode) { case BindingExpressionGrammar.EmptyExpressionNode _: nextNode = new EmptyExpressionNode(); break; case BindingExpressionGrammar.NotNode _: nextNode = new LogicalNotNode(); break; case BindingExpressionGrammar.StreamNode _: nextNode = new StreamNode(); break; case BindingExpressionGrammar.PropertyNameNode propName: nextNode = new PropertyAccessorNode(propName.PropertyName, _enableValidation); break; case BindingExpressionGrammar.IndexerNode indexer: nextNode = new StringIndexerNode(indexer.Arguments); break; case BindingExpressionGrammar.AttachedPropertyNameNode attachedProp: nextNode = ParseAttachedProperty(attachedProp); break; case BindingExpressionGrammar.SelfNode _: nextNode = new SelfNode(); break; case BindingExpressionGrammar.AncestorNode ancestor: nextNode = ParseFindAncestor(ancestor); break; case BindingExpressionGrammar.NameNode elementName: nextNode = new ElementNameNode(_nameScope ?? throw new NotSupportedException("Invalid element name binding with null name scope!"), elementName.Name); break; case BindingExpressionGrammar.TypeCastNode typeCast: nextNode = ParseTypeCastNode(typeCast); break; } if (node is null) { rootNode = node = nextNode; } else { node.Next = nextNode; node = nextNode; } } return(rootNode, mode); }
// $ANTLR start "unaryExpression" // JavaScript.g:313:1: unaryExpression : ( postfixExpression | 'delete' ( LT )* unaryExpression | 'void' ( LT )* unaryExpression | 'typeof' ( LT )* unaryExpression | '++' unaryExpression | '--' unaryExpression | '+' ( LT )* unaryExpression | '-' ( LT )* unaryExpression | '~' ( LT )* unaryExpression | '!' ( LT )* unaryExpression ); public JavaScriptParser.unaryExpression_return unaryExpression() // throws RecognitionException [1] { JavaScriptParser.unaryExpression_return retval = new JavaScriptParser.unaryExpression_return(); retval.Start = input.LT(1); object root_0 = null; IToken string_literal369 = null; IToken LT370 = null; IToken string_literal372 = null; IToken LT373 = null; IToken string_literal375 = null; IToken LT376 = null; IToken string_literal378 = null; IToken string_literal380 = null; IToken char_literal382 = null; IToken LT383 = null; IToken char_literal385 = null; IToken LT386 = null; IToken char_literal388 = null; IToken LT389 = null; IToken char_literal391 = null; IToken LT392 = null; JavaScriptParser.postfixExpression_return postfixExpression368 = default(JavaScriptParser.postfixExpression_return); JavaScriptParser.unaryExpression_return unaryExpression371 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression374 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression377 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression379 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression381 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression384 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression387 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression390 = default(JavaScriptParser.unaryExpression_return); JavaScriptParser.unaryExpression_return unaryExpression393 = default(JavaScriptParser.unaryExpression_return); object string_literal369_tree=null; object LT370_tree=null; object string_literal372_tree=null; object LT373_tree=null; object string_literal375_tree=null; object LT376_tree=null; object string_literal378_tree=null; object string_literal380_tree=null; object char_literal382_tree=null; object LT383_tree=null; object char_literal385_tree=null; object LT386_tree=null; object char_literal388_tree=null; object LT389_tree=null; object char_literal391_tree=null; object LT392_tree=null; try { // JavaScript.g:314:2: ( postfixExpression | 'delete' ( LT )* unaryExpression | 'void' ( LT )* unaryExpression | 'typeof' ( LT )* unaryExpression | '++' unaryExpression | '--' unaryExpression | '+' ( LT )* unaryExpression | '-' ( LT )* unaryExpression | '~' ( LT )* unaryExpression | '!' ( LT )* unaryExpression ) int alt199 = 10; alt199 = dfa199.Predict(input); switch (alt199) { case 1 : // JavaScript.g:314:4: postfixExpression { root_0 = (object)adaptor.GetNilNode(); PushFollow(FOLLOW_postfixExpression_in_unaryExpression2837); postfixExpression368 = postfixExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, postfixExpression368.Tree); } break; case 2 : // JavaScript.g:315:4: 'delete' ( LT )* unaryExpression { root_0 = (object)adaptor.GetNilNode(); string_literal369=(IToken)Match(input,104,FOLLOW_104_in_unaryExpression2843); if (state.failed) return retval; if ( state.backtracking == 0 ) {string_literal369_tree = new DeleteNode(string_literal369) ; root_0 = (object)adaptor.BecomeRoot(string_literal369_tree, root_0); } // JavaScript.g:315:28: ( LT )* do { int alt192 = 2; int LA192_0 = input.LA(1); if ( (LA192_0 == LT) ) { alt192 = 1; } switch (alt192) { case 1 : // JavaScript.g:315:28: LT { LT370=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2849); if (state.failed) return retval; } break; default: goto loop192; } } while (true); loop192: ; // Stops C# compiler whining that label 'loop192' has no statements PushFollow(FOLLOW_unaryExpression_in_unaryExpression2853); unaryExpression371 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression371.Tree); } break; case 3 : // JavaScript.g:316:4: 'void' ( LT )* unaryExpression { root_0 = (object)adaptor.GetNilNode(); string_literal372=(IToken)Match(input,105,FOLLOW_105_in_unaryExpression2859); if (state.failed) return retval; if ( state.backtracking == 0 ) {string_literal372_tree = new VoidNode(string_literal372) ; root_0 = (object)adaptor.BecomeRoot(string_literal372_tree, root_0); } // JavaScript.g:316:24: ( LT )* do { int alt193 = 2; int LA193_0 = input.LA(1); if ( (LA193_0 == LT) ) { alt193 = 1; } switch (alt193) { case 1 : // JavaScript.g:316:24: LT { LT373=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2865); if (state.failed) return retval; } break; default: goto loop193; } } while (true); loop193: ; // Stops C# compiler whining that label 'loop193' has no statements PushFollow(FOLLOW_unaryExpression_in_unaryExpression2869); unaryExpression374 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression374.Tree); } break; case 4 : // JavaScript.g:317:4: 'typeof' ( LT )* unaryExpression { root_0 = (object)adaptor.GetNilNode(); string_literal375=(IToken)Match(input,106,FOLLOW_106_in_unaryExpression2875); if (state.failed) return retval; if ( state.backtracking == 0 ) {string_literal375_tree = new TypeOfExpr(string_literal375) ; root_0 = (object)adaptor.BecomeRoot(string_literal375_tree, root_0); } // JavaScript.g:317:28: ( LT )* do { int alt194 = 2; int LA194_0 = input.LA(1); if ( (LA194_0 == LT) ) { alt194 = 1; } switch (alt194) { case 1 : // JavaScript.g:317:28: LT { LT376=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2881); if (state.failed) return retval; } break; default: goto loop194; } } while (true); loop194: ; // Stops C# compiler whining that label 'loop194' has no statements PushFollow(FOLLOW_unaryExpression_in_unaryExpression2885); unaryExpression377 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression377.Tree); } break; case 5 : // JavaScript.g:318:4: '++' unaryExpression { root_0 = (object)adaptor.GetNilNode(); string_literal378=(IToken)Match(input,107,FOLLOW_107_in_unaryExpression2891); if (state.failed) return retval; if ( state.backtracking == 0 ) {string_literal378_tree = new preIncExpr(string_literal378) ; root_0 = (object)adaptor.BecomeRoot(string_literal378_tree, root_0); } PushFollow(FOLLOW_unaryExpression_in_unaryExpression2897); unaryExpression379 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression379.Tree); } break; case 6 : // JavaScript.g:319:4: '--' unaryExpression { root_0 = (object)adaptor.GetNilNode(); string_literal380=(IToken)Match(input,108,FOLLOW_108_in_unaryExpression2903); if (state.failed) return retval; if ( state.backtracking == 0 ) {string_literal380_tree = new preDecExpr(string_literal380) ; root_0 = (object)adaptor.BecomeRoot(string_literal380_tree, root_0); } PushFollow(FOLLOW_unaryExpression_in_unaryExpression2909); unaryExpression381 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression381.Tree); } break; case 7 : // JavaScript.g:320:4: '+' ( LT )* unaryExpression { root_0 = (object)adaptor.GetNilNode(); char_literal382=(IToken)Match(input,99,FOLLOW_99_in_unaryExpression2915); if (state.failed) return retval; if ( state.backtracking == 0 ) {char_literal382_tree = new PosNode(char_literal382) ; root_0 = (object)adaptor.BecomeRoot(char_literal382_tree, root_0); } // JavaScript.g:320:20: ( LT )* do { int alt195 = 2; int LA195_0 = input.LA(1); if ( (LA195_0 == LT) ) { alt195 = 1; } switch (alt195) { case 1 : // JavaScript.g:320:20: LT { LT383=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2921); if (state.failed) return retval; } break; default: goto loop195; } } while (true); loop195: ; // Stops C# compiler whining that label 'loop195' has no statements PushFollow(FOLLOW_unaryExpression_in_unaryExpression2925); unaryExpression384 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression384.Tree); } break; case 8 : // JavaScript.g:321:4: '-' ( LT )* unaryExpression { root_0 = (object)adaptor.GetNilNode(); char_literal385=(IToken)Match(input,100,FOLLOW_100_in_unaryExpression2931); if (state.failed) return retval; if ( state.backtracking == 0 ) {char_literal385_tree = new NegNode(char_literal385) ; root_0 = (object)adaptor.BecomeRoot(char_literal385_tree, root_0); } // JavaScript.g:321:20: ( LT )* do { int alt196 = 2; int LA196_0 = input.LA(1); if ( (LA196_0 == LT) ) { alt196 = 1; } switch (alt196) { case 1 : // JavaScript.g:321:20: LT { LT386=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2937); if (state.failed) return retval; } break; default: goto loop196; } } while (true); loop196: ; // Stops C# compiler whining that label 'loop196' has no statements PushFollow(FOLLOW_unaryExpression_in_unaryExpression2941); unaryExpression387 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression387.Tree); } break; case 9 : // JavaScript.g:322:4: '~' ( LT )* unaryExpression { root_0 = (object)adaptor.GetNilNode(); char_literal388=(IToken)Match(input,109,FOLLOW_109_in_unaryExpression2947); if (state.failed) return retval; if ( state.backtracking == 0 ) {char_literal388_tree = new BinaryNotNode(char_literal388) ; root_0 = (object)adaptor.BecomeRoot(char_literal388_tree, root_0); } // JavaScript.g:322:26: ( LT )* do { int alt197 = 2; int LA197_0 = input.LA(1); if ( (LA197_0 == LT) ) { alt197 = 1; } switch (alt197) { case 1 : // JavaScript.g:322:26: LT { LT389=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2953); if (state.failed) return retval; } break; default: goto loop197; } } while (true); loop197: ; // Stops C# compiler whining that label 'loop197' has no statements PushFollow(FOLLOW_unaryExpression_in_unaryExpression2957); unaryExpression390 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression390.Tree); } break; case 10 : // JavaScript.g:323:4: '!' ( LT )* unaryExpression { root_0 = (object)adaptor.GetNilNode(); char_literal391=(IToken)Match(input,110,FOLLOW_110_in_unaryExpression2963); if (state.failed) return retval; if ( state.backtracking == 0 ) {char_literal391_tree = new LogicalNotNode(char_literal391) ; root_0 = (object)adaptor.BecomeRoot(char_literal391_tree, root_0); } // JavaScript.g:323:27: ( LT )* do { int alt198 = 2; int LA198_0 = input.LA(1); if ( (LA198_0 == LT) ) { alt198 = 1; } switch (alt198) { case 1 : // JavaScript.g:323:27: LT { LT392=(IToken)Match(input,LT,FOLLOW_LT_in_unaryExpression2969); if (state.failed) return retval; } break; default: goto loop198; } } while (true); loop198: ; // Stops C# compiler whining that label 'loop198' has no statements PushFollow(FOLLOW_unaryExpression_in_unaryExpression2973); unaryExpression393 = unaryExpression(); state.followingStackPointer--; if (state.failed) return retval; if ( state.backtracking == 0 ) adaptor.AddChild(root_0, unaryExpression393.Tree); } break; } retval.Stop = input.LT(-1); if ( (state.backtracking==0) ) { retval.Tree = (object)adaptor.RulePostProcessing(root_0); adaptor.SetTokenBoundaries(retval.Tree, (IToken) retval.Start, (IToken) retval.Stop);} } catch (RecognitionException re) { ReportError(re); Recover(input,re); // Conversion of the second argument necessary, but harmless retval.Tree = (object)adaptor.ErrorNode(input, (IToken) retval.Start, input.LT(-1), re); } finally { } return retval; }
public virtual LogicalNotNode Visit(LogicalNotNode node) { return(node); }