Axiom.Compiler.Framework.PrologCodeParser.ConvertGoalBinaryTreeToCodeDOM C# (CSharp) Метод

ConvertGoalBinaryTreeToCodeDOM() приватный Метод

private ConvertGoalBinaryTreeToCodeDOM ( BinaryTree goal ) : PrologCodeTerm
goal BinaryTree
Результат Axiom.Compiler.CodeObjectModel.PrologCodeTerm
        private PrologCodeTerm ConvertGoalBinaryTreeToCodeDOM(BinaryTree goal)
        {
            if (goal.Name == ".")
            {
                return ConvertBinaryListToCodeDOM(goal);
            }
            else if (Char.IsUpper(goal.Name[0]))  // Goal is a variable
            {
                return new PrologCodeVariable(goal.Name);
            }
            else
            {
                PrologCodePredicate goalPredicate = new PrologCodePredicate(goal.Name);
                ArrayList gargs = new ArrayList();
                goal.Flatten(goal, ref gargs);
                goalPredicate.IsMethod = IsMethod(goal.Name, gargs.Count);
                goalPredicate.MethodInfo = GetMethodInfo(goal.Name);

                if (goal.Arguments != null && goal.Arguments.Count != 0)
                {
                    // Example:
                    // goal(X,a).
                    ArrayList arguments = new ArrayList();
                    goal.Flatten((BinaryTree)goal.Arguments[0], ref arguments);
                    foreach (BinaryTree a in arguments)
                    {
                        goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(a));
                    }
                    return goalPredicate;
                }
                else
                {
                    // X = a (goal is '=')
                    if (goal.Left != null && goal.Right != null)
                    {
                        goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Left));
                        goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Right));
                        return goalPredicate;
                    }
                    // [] + foo.
                    if (goal.Left == null && goal.Right != null)
                    {
                        goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Right));
                        return goalPredicate;
                    }
                    // X + []
                    if (goal.Left != null && goal.Right == null)
                    {
                        goalPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(goal.Left));
                        return goalPredicate;
                    }
                    if (goal.Left == null && goal.Right == null)
                    {
                        return goalPredicate;
                    }
                }
            }
            return null;
        }