Axiom.Compiler.Framework.PrologCodeGenerator.CompileGoalRecord C# (CSharp) Метод

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

private CompileGoalRecord ( PrologCodeTerm term, int index ) : int
term Axiom.Compiler.CodeObjectModel.PrologCodeTerm
index int
Результат int
        private int CompileGoalRecord(PrologCodeTerm term, int index)
        {
            ArrayList recs = new ArrayList();
            int nRecs = 0;
            ArrayList arguments = new ArrayList();

            if (term is PrologCodeNonEmptyList)
            {
                PrologCodeNonEmptyList NEList = (PrologCodeNonEmptyList)term;
                arguments.Add(NEList.Head);
                arguments.Add(NEList.Tail);
            }
            else if (term is PrologCodePredicate)
            {
                arguments = ((PrologCodePredicate)term).Arguments;
            }

            for (int i = 0; i < arguments.Count; i++)
            {
                PrologCodeTerm r = (PrologCodeTerm)arguments[i];
                if (r is PrologCodeNonEmptyList || r is PrologCodePredicate)
                {
                    nRecs = recs.Add(CompileGoalRecord(r, -1));
                }
            }
            if (index == -1)
            {
                index = PrologRegisterTable.Instance.FindRegister();
            }
            if (term is PrologCodeNonEmptyList)
            {
                _generator.Emit(OpCodes.Put_List, X(index));
            }
            else if(term is PrologCodePredicate)
            {
                PrologCodePredicate s = (PrologCodePredicate)term;
                _generator.Emit(OpCodes.Put_Structure, s.Name + "/" + s.Arity, X(index));
            }
            nRecs = 0;
            for (int i = 0; i < arguments.Count; i++)
            {
                PrologCodeTerm t = (PrologCodeTerm)arguments[i];
                if (t is PrologCodeNilAtom || t is PrologCodeEmptyList)
                {
                    _generator.Emit(OpCodes.Set_Constant, "[]");
                }
                else if (t is PrologCodeAtom)
                {
                    if (t is PrologCodeConstantAtom)
                    {
                        _generator.Emit(OpCodes.Set_Constant, ((PrologCodeConstantAtom)t).Value);
                    }
                    else if (t is PrologCodeStringAtom)
                    {
                        _generator.Emit(OpCodes.Set_Constant, ((PrologCodeStringAtom)t).Value);
                    }
                    else if (t is PrologCodeIntegerAtom)
                    {

                        _generator.Emit(OpCodes.Set_Constant, ((PrologCodeIntegerAtom)t).Value.ToString());

                    }
                    else if (t is PrologCodeFloatAtom)
                    {
                        _generator.Emit(OpCodes.Set_Constant, ((PrologCodeFloatAtom)t).Value.ToString());

                    }
                }
                else if (t is PrologCodeVariable)
                {
                    /* Compile Goal record variable */
                    CompileGoalRecordVariable((PrologCodeVariable)t);
                }
                else if (t is PrologCodePredicate || t is PrologCodeNonEmptyList)
                {
                    _generator.Emit(OpCodes.Set_Value, X((int)recs[nRecs]));
                    PrologRegisterTable.Instance.FreeRegister((int)recs[nRecs]);
                    nRecs++;
                }
            }
            return index;
        }