/// <summary>
        /// Given a tree node, the node is translated into code, this method is
        /// recursively called for each of the node's children.
        /// </summary>
        /// <param name="node">The node to translate</param>
        protected void WriteProgramBody(GPNode node)
        {
            //
            // Recursively work through the nodes
            if (node is GPNodeTerminal)
            {
                m_Writer.Write(((GPNodeTerminal)node).ToString());
                //
                // There are no children, so don't need to make a recursive call
            }
            else if (node is GPNodeFunction)
            {
                if (node is GPNodeFunctionADF)
                {
                    GPNodeFunctionADF adf = (GPNodeFunctionADF)node;
                    m_Writer.Write(" _\n\t\tADF" + adf.WhichFunction);
                    m_Writer.Write("(");
                    //
                    // The parameters to the ADF are its children
                    for (int Param = 0; Param < adf.NumberArgs; Param++)
                    {
                        if (Param > 0)
                        {
                            m_Writer.Write(",");
                        }
                        WriteProgramBody(((GPNodeFunction)node).Children[Param]);
                    }

                    m_Writer.Write(") _\n\t\t");
                }
                else if (node is GPNodeFunctionADL)
                {
                    GPNodeFunctionADL adl = (GPNodeFunctionADL)node;
                    m_Writer.Write(" _\n\t\tADL" + adl.WhichFunction);
                    m_Writer.Write("(");
                    //
                    // The parameters to the ADL are its children
                    for (int Param = 0; Param < adl.NumberArgs; Param++)
                    {
                        if (Param > 0)
                        {
                            m_Writer.Write(",");
                        }
                        WriteProgramBody(((GPNodeFunction)node).Children[Param]);
                    }
                    m_Writer.Write(") _\n\t\t");
                }
                else if (node is GPNodeFunctionSetMem)
                {
                    m_Writer.Write(" _\n\t\tSetMem(");
                    WriteProgramBody(((GPNodeFunction)node).Children[0]);
                    m_Writer.Write(",");
                    WriteProgramBody(((GPNodeFunction)node).Children[1]);
                    m_Writer.Write(")");
                }
                else if (node is GPNodeFunctionGetMem)
                {
                    m_Writer.Write(" _\n\t\tGetMem(");
                    WriteProgramBody(((GPNodeFunction)node).Children[0]);
                    m_Writer.Write(")");
                }
                else
                {
                    m_Writer.Write(" _\n\t\t" + node.ToString() + "(");
                    //
                    // The parameters to the function are its children
                    for (short Param = 0; Param < m_FunctionSet[node.ToString().ToUpper()].Arity; Param++)
                    {
                        if (Param > 0)
                        {
                            m_Writer.Write(",");
                        }
                        WriteProgramBody(((GPNodeFunction)node).Children[Param]);
                    }
                    m_Writer.Write(")");
                }
            }
            else
            {
                Console.WriteLine("Have an undefined node we are tying to write");
            }
        }
Exemple #2
0
        /// <summary>
        /// Given a tree node, the node is translated into code, this method is
        /// recursively called for each of the node's children.
        /// </summary>
        /// <param name="node">The node to translate</param>
        protected void WriteProgramBody(GPNode node)
        {
            //
            // Recursively work through the nodes
            if (node is GPNodeTerminal)
            {
                if (node is GPNodeTerminalDouble || node is GPNodeTerminalInteger)
                {
                    //
                    // Put doubles on their own line, helps prevent the lines
                    // from getting too long
                    m_Writer.WriteLine();
                    m_Writer.Write("     . ");
                }
                m_Writer.Write(((GPNodeTerminal)node).ToString());
                //
                // There are no children, so don't need to make a recursive call
            }
            else if (node is GPNodeFunction)
            {
                if (node is GPNodeFunctionADF)
                {
                    GPNodeFunctionADF adf = (GPNodeFunctionADF)node;
                    m_Writer.Write("\n     . ADF" + adf.WhichFunction);
                    m_Writer.Write("(");
                    //
                    // The parameters to the ADF are its children
                    for (int Param = 0; Param < adf.NumberArgs; Param++)
                    {
                        if (Param > 0)
                        {
                            m_Writer.Write(",");
                        }
                        WriteProgramBody(((GPNodeFunction)node).Children[Param]);
                    }

                    m_Writer.Write(")\n     . ");
                }
                else if (node is GPNodeFunctionADL)
                {
                    GPNodeFunctionADL adl = (GPNodeFunctionADL)node;
                    m_Writer.Write("\n     . ADL" + adl.WhichFunction);
                    m_Writer.Write("(");
                    //
                    // The parameters to the ADL are its children
                    for (int Param = 0; Param < adl.NumberArgs; Param++)
                    {
                        if (Param > 0)
                        {
                            m_Writer.Write(",");
                        }
                        WriteProgramBody(((GPNodeFunction)node).Children[Param]);
                    }
                    m_Writer.Write(")\n     . ");
                }
                else if (node is GPNodeFunctionSetMem)
                {
                    m_Writer.Write("\n     . SetMem(");
                    WriteProgramBody(((GPNodeFunction)node).Children[0]);
                    m_Writer.Write(",");
                    WriteProgramBody(((GPNodeFunction)node).Children[1]);
                    m_Writer.Write(")");
                }
                else if (node is GPNodeFunctionGetMem)
                {
                    m_Writer.Write("\n     . GetMem(");
                    WriteProgramBody(((GPNodeFunction)node).Children[0]);
                    m_Writer.Write(")");
                }
                else
                {
                    m_Writer.Write("\n     . " + node.ToString() + "(");
                    //
                    // The parameters to the function are its children
                    for (short Param = 0; Param < m_FunctionSet[node.ToString().ToUpper()].Arity; Param++)
                    {
                        if (Param > 0)
                        {
                            m_Writer.Write(",");
                        }
                        WriteProgramBody(((GPNodeFunction)node).Children[Param]);
                    }
                    m_Writer.Write(")");
                }
            }
            else
            {
                Console.WriteLine("Have an undefined node we are tying to write");
            }
        }