private IAstNodeValidator FindValidatorForVisitor(IAstNodeVisitor nodeVisitor)
        {
            foreach (IAstNodeValidator nodeValidator in nodeValidators) {
                foreach (Type type in nodeValidator.NodeType) {
                    if (IsTypeInTypeArray(type, nodeVisitor.NodeType)) {
                        return nodeValidator;
                    }
                }
            }

            return null;
        }
Exemple #2
0
        public void Accept(IAstNodeVisitor visitor)
        {
            visitor.VisitEnter(this);

            Boolean isFirstTime = true;
            foreach (AstNode node in Children)
            {
                if (!isFirstTime)
                {
                    visitor.VisitExecute(this);
                }

                isFirstTime = false;
                node.Accept(visitor);
            }

            visitor.VisitLeave(this);
        }
Exemple #3
0
        public void Accept(IAstNodeVisitor visitor)
        {
            visitor.VisitEnter(this);

            Boolean isFirstTime = true;

            foreach (AstNode node in Children)
            {
                if (!isFirstTime)
                {
                    visitor.VisitExecute(this);
                }

                isFirstTime = false;
                node.Accept(visitor);
            }

            visitor.VisitLeave(this);
        }
        /// <summary>
        /// Performs the specified action on an expression tree.
        /// </summary>
        /// <returns>The top node of the results.</returns>
        /// <exception>ApplicationException</exception>
        /// <param name="node">The top node of the tree.</param>
        /// <param name="data">Data passed to the visitor (Typically not used).</param>
        /// <param name="pv">Visitor object that can be used to descend the tree.</param>
        /// <param name="stack">The stack to operate on.</param>
        /// <exception cref="ApplicationException">If operator must have 3 arguments.</exception>
        public virtual object Evaluate( AstNode node, object data, IAstNodeVisitor pv, Stack< double? > stack )
        {
            if ( node.NumChildren != 3 )
                throw new ApplicationException( "If operator must have 3 arguments." );

            AstNode condition = node.GetChild( 0 );
            condition.Accept( pv, data );

            CheckStack( stack );

            double? condVal = stack.Pop();
            if ( condVal.HasValue && ( condVal > 0.0 ) )
            {
                AstNode trueNode = node.GetChild( 1 );
                trueNode.Accept( pv, data );
                return data;
            }

            AstNode falseNode = node.GetChild( 2 );
            falseNode.Accept( pv, data );
            return data;
        }
Exemple #5
0
 public override T Accept <T>(IAstNodeVisitor <T> visitor)
 {
     return(visitor.Visit(this));
 }
Exemple #6
0
 public void Accept(IAstNodeVisitor visitor)
 {
     visitor.Visit(this);
 }
Exemple #7
0
 public void Accept(IAstNodeVisitor visitor)
 {
     visitor.Visit(this);
 }
Exemple #8
0
 public abstract T Accept <T>(IAstNodeVisitor <T> visitor);
 /// <summary>
 /// Accept a visitor object. The visitor must be of type IAstNodeVisitor, however
 /// if the visitor also implements the most type-specific IAstLiteralNodeVisitor,
 /// or the next most type-specific IAstValueNodeVisitor interface, it uses the
 /// interface for the visit callback. Note that it uses the most type-specific
 /// interface as per its own inheritence tree. ie.
 /// <p/>
 /// AstLiteralNode -&gt; AstValueNode -&gt; SimpleNode <br/>
 /// IAstLiteralNodeVisitor -&gt; IAstValueNodeVisitor -&gt; IAstNodeVisitor
 /// <p/>
 /// This is an implementation of the AcyclicVisitor pattern by Robert C. Martin.
 /// Details of the pattern and its usage can be found at ObjectMentor.com.<br/>
 /// URL: http://www.objectmentor.com/resources/articles/acv.pdf
 /// </summary>
 /// <param name="visitor"> The object visiting this node. </param>
 /// <param name="sessionData"> Misc sessionData to use during this visit. </param>
 /// <returns> The session data object. </returns>
 internal override object Accept( IAstNodeVisitor visitor, object sessionData )
 {
     if ( visitor is IAstLiteralNodeVisitor )
         return ( (IAstLiteralNodeVisitor)visitor ).Visit( this, sessionData );
     if ( visitor is IAstValueNodeVisitor )
         return ( (IAstValueNodeVisitor)visitor ).Visit( this, sessionData );
     return visitor.Visit( this, sessionData );
 }
Exemple #10
0
 /// <inheritdoc />
 public override TOut Accept <TState, TOut>(IAstNodeVisitor <TInstruction, TState, TOut> visitor, TState state) =>
 visitor.Visit(this, state);
Exemple #11
0
 public abstract void Accept(IAstNodeVisitor visitor);
Exemple #12
0
 /// <summary>
 /// Implements the visitor pattern
 /// </summary>
 public abstract TOut Accept <TState, TOut>(IAstNodeVisitor <TInstruction, TState, TOut> visitor, TState state);
Exemple #13
0
 /// <inheritdoc />
 public override void Accept <TState>(IAstNodeVisitor <TInstruction, TState> visitor, TState state) =>
 visitor.Visit(this, state);
Exemple #14
0
        /// <summary>
        /// Accept a visitor object to all the child nodes of this node.
        /// </summary>
        /// <param name="visitor">Visitor object to call the "visit" upon.</param>
        /// <param name="data">Data relevant to the visitor's visit.</param>
        /// <returns>The context object.</returns>
        internal virtual object ChildrenAccept( IAstNodeVisitor visitor, object data )
        {
            if ( _children != null )
            {
                foreach ( AstNode t in _children )
                    t.Accept( visitor, data );
            }

            return data;
        }
        /// <summary>
        /// Accept a visitor object. The visitor must be of type IAstNodeVisitor, however
        /// if the visitor also implements the more type-specific IAstFunctionNodeVisitor,
        /// it uses its interface for the visit callback.
        /// <p/>
        /// This is an implementation of the AcyclicVisitor pattern by Robert C. Martin.
        /// Details of the pattern and its usage can be found at ObjectMentor.com.<br/>
        /// URL: http://www.objectmentor.com/resources/articles/acv.pdf
        /// </summary>
        /// <param name="visitor">
        /// The object visiting this node.
        /// </param>
        /// <param name="sessionData">
        /// Misc data to use during this visit.
        /// </param>
        /// <returns>
        /// The session data object.
        /// </returns>
        internal override object Accept( IAstNodeVisitor visitor, object sessionData )
        {
            if ( visitor is IAstFunctionNodeVisitor )
                return ( (IAstFunctionNodeVisitor)visitor ).Visit( this, sessionData );

            return visitor.Visit( this, sessionData );
        }
Exemple #16
0
 /// <summary>
 /// Accept a visitor object.
 /// <p> This is an implementation of the AcyclicVisitor pattern by Robert C. Martin.
 /// Details of the pattern and its usage can be found at ObjectMentor.com.<br /> URL:
 /// http://www.objectmentor.com/resources/articles/acv.pdf
 /// </p>
 /// </summary>
 /// <param name="visitor">Visitor object to call the "visit" upon.</param>
 /// <param name="sessionData">Data relevant to the visitor's visit.</param>
 /// <returns>The visitor context object.</returns>
 internal abstract object Accept( IAstNodeVisitor visitor, object sessionData );
Exemple #17
0
 public abstract TResult Accept <TResult, T>(IAstNodeVisitor <TResult, T> visitor, T value);
Exemple #18
0
 public abstract TResult Accept <TResult>(IAstNodeVisitor <TResult> visitor);
Exemple #19
0
 public override TResult Accept <TResult, T>(IAstNodeVisitor <TResult, T> visitor, T value)
 {
     return(visitor.Visit(this, value));
 }
Exemple #20
0
 public override TResult Accept <TResult>(IAstNodeVisitor <TResult> visitor)
 {
     return(visitor.Visit(this));
 }
 public override void Accept(IAstNodeVisitor visitor)
 {
     visitor.Visit(this);
 }
Exemple #22
0
 /// <summary>
 /// Implements the visitor pattern
 /// </summary>
 public abstract void Accept <TState>(IAstNodeVisitor <TInstruction, TState> visitor, TState state);