コード例 #1
0
        public void ExtractData(AST root)
        {
            if (root is IProcedureList)
            {
                foreach (Procedure procedure in root as IProcedureList)
                {
                    Procedures.AddProcedure(procedure);
                }
                foreach (Procedure procedure in root as IProcedureList)
                {
                    ExtractProcedure(procedure);
                }

                foreach (Procedure procedure in Procedures)
                {
                    IProcedureList calledProcedures = CallsTable.GetCalledBy(procedure);
                    if (calledProcedures.GetSize() == 0)
                    {
                        ExtractProcedureCalls(procedure);
                    }
                }

                ExtractAffects();
            }
        }
コード例 #2
0
        private void ExtractCall(Call call, Procedure procedureContext)
        {
            Procedure calledProcedure = Procedures.GetProcedureByName(call.ProcedureName);

            call.Procedure = calledProcedure;

            CallsTable.SetCalls(procedureContext, calledProcedure);

            if (!calls.ContainsKey(procedureContext))
            {
                calls[procedureContext] = new List <Call>();
            }
            calls[procedureContext].Add(call);
        }
コード例 #3
0
        private void ExtractProcedureCalls(Procedure procedure)
        {
            IProcedureList callingProcedures = CallsTable.GetCalling(procedure);

            foreach (Procedure callingProcedure in callingProcedures)
            {
                List <Call> procedureCalls = calls[callingProcedure].Where(x => x.Procedure == procedure).ToList();
                foreach (Call call in procedureCalls)
                {
                    IStatementList callParents = ParentTable.GetParentT(call);

                    IVariableList modifiedVariables = ModifiesTable.GetModifiedBy(procedure);
                    IVariableList usedVariables     = UsesTable.GetUsedBy(procedure);

                    foreach (Variable variable in modifiedVariables)
                    {
                        ModifiesTable.SetModifies(call, variable);
                        ModifiesTable.SetModifies(callingProcedure, variable);
                        foreach (Statement parent in callParents)
                        {
                            ModifiesTable.SetModifies(parent, variable);
                        }
                    }
                    foreach (Variable variable in usedVariables)
                    {
                        UsesTable.SetUses(call, variable);
                        UsesTable.SetUses(callingProcedure, variable);
                        foreach (Statement parent in callParents)
                        {
                            UsesTable.SetUses(parent, variable);
                        }
                    }
                    ExtractProcedureCalls(callingProcedure);
                }
            }
        }