private void MakeDefineArgument(SymArgument aArgument)
        {
            // Convert generic argument into define-specific argument
            SymDefineArgument defineArgument = new SymDefineArgument(aArgument);

            iDefine.AddArgument(defineArgument);
        }
        protected virtual void ArgumentStarted(SymToken aToken, SymTokenBalancerMatchCriteria aCriteria)
        {
            System.Diagnostics.Debug.Write(aToken.Value);

            int currentLevelNumber = CurrentLevelNumber;

            // Perform any base class end level behaviour
            PerformEndLevelBehaviour(CurrentNode, aCriteria);

            // Add the emit node (the rest of the code will work out whether it needs to quote it when the final
            // tree is formed).
            SymTokenBalancerNodeEmittedElement argEmitElement = new SymTokenBalancerNodeEmittedElement(aToken, aCriteria);

            DocumentTree.CurrentNode.Add(argEmitElement);

            // Always add the argument node
            SymTokenBalancerMarkerArgumentNode argNode = new SymTokenBalancerMarkerArgumentNode(aCriteria);

            DocumentTree.CurrentNode.Add(argNode);

            if (aCriteria.IsAssociatedBehaviourCreateSubTree)
            {
                // Make a new argument definition based upon the tokens we have in
                // the main document tree.
                SymArgument argument = MakeArgument(DocumentTree.CurrentNode);

                // Then notify the observer
                NotifyArgumentAvailable(argument, aToken);
            }
        }
 protected virtual void NotifyArgumentAvailable(SymArgument aArgument, SymToken aDelimitingToken)
 {
     if (EventArgumentAvailableHandler != null)
     {
         EventArgumentAvailableHandler(aArgument, aDelimitingToken);
     }
 }
        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 MakeDefineArgument()
        {
            SymArgument argument = iFunctionParser.MakeArgument();

            MakeDefineArgument(argument);
        }
 private void FunctionParserEventArgumentAvailableHandler(SymArgument aArgument, SymToken aDelimitingToken)
 {
     MakeDefineArgument(aArgument);
 }