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

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

private ConvertGoalVariableBinaryTreeToCodeDOM ( BinaryTree var ) : PrologCodeTerm
var BinaryTree
Результат Axiom.Compiler.CodeObjectModel.PrologCodeTerm
        private PrologCodeTerm ConvertGoalVariableBinaryTreeToCodeDOM(BinaryTree var)
        {
            if (Char.IsUpper(var.Name[0]) || var.Name[0] == '_' || var.Name == "_")
            {
                if (var.Name == "_")
                {
                    _randomVariableID++;
                    return new PrologCodeVariable(var.Name + "%" + _randomVariableID.ToString());
                }
                return new PrologCodeVariable(var.Name);
            }
            else
            {
                // Not a functor, => atom | number | string
                if (var.Arguments == null || var.Arguments.Count == 0)
                {
                    if (var.Name == ".")
                    {
                        // TODO: can place return PrologCodeEmptyList() here.
                        return ConvertBinaryListToCodeDOM(var);
                    }
                    if (var.Left == null && var.Right == null)
                    {
                        // 'Atom string'
                        if (var.Name[0] == '\'')
                        {
                            return new PrologCodeStringAtom(var.Name);
                        }
                        else if (Char.IsDigit(var.Name[0]))
                        {
                            // 1.234
                            if (var.Name.IndexOf('.') != -1)
                            {
                                return new PrologCodeFloatAtom(float.Parse(var.Name));
                            }
                            // 213
                            else
                            {
                                return new PrologCodeIntegerAtom(Int32.Parse(var.Name));
                            }
                        }
                        else if (var.Name == "_")
                        {
                            return new PrologCodeNilAtom();
                        }
                        // atom
                        else
                        {

                            return new PrologCodeConstantAtom(var.Name);
                        }
                    }
                    else if (var.Left != null && var.Right != null)
                    {
                        PrologCodePredicate infixPredicate = new PrologCodePredicate(var.Name);
                        infixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Left));
                        infixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Right));
                        return infixPredicate;
                    }
                    else if (var.Left == null && var.Right != null)
                    {
                        PrologCodePredicate prefixPredicate = new PrologCodePredicate(var.Name);
                        prefixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Right));
                        return prefixPredicate;
                    }
                    else if (var.Left != null && var.Right == null)
                    {
                        PrologCodePredicate postfixPredicate = new PrologCodePredicate(var.Name);
                        postfixPredicate.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(var.Left));
                        return postfixPredicate;
                    }

                }
                // atom(a,X,atom(X)).
                else
                {
                    PrologCodePredicate functor = new PrologCodePredicate(var.Name);
                    ArrayList arguments = new ArrayList();
                    var.Flatten((BinaryTree)var.Arguments[0], ref arguments);
                    foreach (BinaryTree a in arguments)
                    {
                        functor.Arguments.Add(ConvertGoalVariableBinaryTreeToCodeDOM(a));
                    }
                    return functor;
                }

            }
            return null;
        }