Ejemplo n.º 1
0
        public virtual SymArgument MakeArgument(SymNode aLevelToMakeArgumentsFrom)
        {
            SymArgument argument = new SymArgument();

            // Convert (recursively) any emitted elements to real tokens
            if (aLevelToMakeArgumentsFrom is SymTokenBalancerMarkerLevelNode)
            {
                SymTokenBalancerMarkerLevelNode levelNode = (SymTokenBalancerMarkerLevelNode)aLevelToMakeArgumentsFrom;
                levelNode.ConvertEmittedElementsToRealTokenNodes(true /*recurse*/);
            }

            // Now actually obtain the argument tokens
            int count = aLevelToMakeArgumentsFrom.ChildCount;
            int i     = 0;

            //
            while (i < count)
            {
                SymNode n = aLevelToMakeArgumentsFrom[0];

                // We always remove any other nodes, irrespective of their type.
                // This is to ensure that the document tree does not get cluttered
                // with redundant argument token info.
                n.Remove();

                // Now we decide what to do...
                if (n is SymTokenBalancerMarkerArgumentNode)
                {
                    // We've reached the argument itself. This is the
                    // signal to stop processing. We remove the argument node
                    // since its not relevant to the production of the tree.
                    break;
                }
                else if (n is SymTokenBalancerMarkerLevelNode)
                {
                    // Create a new sub-argument node and copy over the
                    // children.
                    SymTokenBalancerMarkerLevelNode levelNode = (SymTokenBalancerMarkerLevelNode)n;
                    SymArgumentSubLevel             subLevel  = levelNode.AsArgumentSubLevel(true);
                    argument.CurrentNode.Add(subLevel);
                }
                else if (n is SymTokenBalancerNodeEmittedElement)
                {
                    System.Diagnostics.Debug.Assert(false);                       // shouldn't get here anymore!
                }
                else if (n is SymNodeToken)
                {
                    // Node is implicitly removed since it transfers
                    // from one tree to another.
                    argument.CurrentNode.Add(n);
                }

                count = aLevelToMakeArgumentsFrom.ChildCount;
            }
            //
            SymTokenUtils.RemoveWhiteSpace(argument, true);
            return(argument);
        }
        private void EvaluateDefineNodes(SymNode aNode, SymTokenDocument aDocument, SymParserDocumentContext aContext)
        {
            foreach (SymNode n in aNode)
            {
                if (n is SymTokenBalancerMarkerLevelNode)
                {
                    bool added = false;
                    //
                    SymTokenBalancerMarkerLevelNode levelNode = (SymTokenBalancerMarkerLevelNode)n;
                    if (levelNode.IsFunction)
                    {
                        SymNodeToken functionNameNode = levelNode.FunctionName;
                        //
                        if (functionNameNode.Token.Equals(iDefinedNodeToken))
                        {
                            SymTokenContainer defineName = levelNode.ChildTokens;
                            string            flattened  = defineName.CoalescedTokenValue;

                            // Get definition result
                            bool     isDefined      = aContext.DefineDirectory.IsDefined(flattened);
                            SymToken isDefinedToken = new SymToken(isDefined.ToString().ToLower(), SymToken.TClass.EClassAlphaNumeric, SymToken.TType.ETypeAlphaNumericNormal);

                            // Remove already added "defined" text node from output document
                            if (aDocument.CurrentNode.LastChild is SymNodeToken)
                            {
                                SymNodeToken last = (SymNodeToken)aDocument.CurrentNode.LastChild;
                                if (last.Token.Equals(iDefinedNodeToken))
                                {
                                    last.Remove();
                                }
                            }

                            // Add result
                            aDocument.CurrentNode.Add(new SymNodeToken(isDefinedToken));
                            added = true;
                        }
                    }

                    if (added == false)
                    {
                        if (levelNode.HasPrevious && levelNode.Previous is SymTokenBalancerNodeEmittedElement)
                        {
                            levelNode.EmittedElementPrevious.AddToDocumentIfEmittable(aDocument);
                        }

                        SymNode newLevelNode = new SymNodeAddAsChild();
                        aDocument.CurrentNode.Add(newLevelNode);
                        aDocument.CurrentNode = newLevelNode;
                        EvaluateDefineNodes(n, aDocument, aContext);
                        aDocument.MakeParentCurrent();

                        if (levelNode.HasNext && levelNode.Next is SymTokenBalancerNodeEmittedElement)
                        {
                            levelNode.EmittedElementNext.AddToDocumentIfEmittable(aDocument);
                        }
                    }
                }
                else if (n is SymNodeToken)
                {
                    SymNodeToken node = (SymNodeToken)n;
                    SymNodeToken copy = new SymNodeToken(node.Token);
                    aDocument.CurrentNode.Add(copy);
                }
                else if (n is SymTokenBalancerNodeEmittedElement)
                {
                    // Handled when the level marker is reached
                }
            }
        }