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 } } }