Exemplo n.º 1
0
        private bool PropagateRuleTypes(IRFact fact)
        {
            bool updated = false;

            PropagateSignatureIfRequired(fact.Database.Name, FunctionType.Database, fact.Elements, ref updated);
            return(updated);
        }
Exemplo n.º 2
0
        private void VerifyIRFact(IRFact fact)
        {
            if (fact.Database == null)
            {
                return;
            }

            var db = Context.LookupSignature(fact.Database.Name);

            if (db == null)
            {
                Context.Log.Error(fact.Location,
                                  DiagnosticCode.UnresolvedSymbol,
                                  "Database \"{0}\" could not be resolved",
                                  fact.Database.Name);
                return;
            }

            if (db.Type != FunctionType.Database &&
                db.Type != FunctionType.Call &&
                db.Type != FunctionType.SysCall &&
                db.Type != FunctionType.Proc)
            {
                Context.Log.Error(fact.Location,
                                  DiagnosticCode.InvalidSymbolInFact,
                                  "Init/Exit actions can only reference databases, calls and PROCs; \"{0}\" is a {1}",
                                  fact.Database.Name, db.Type);
                return;
            }

            if (fact.Not)
            {
                db.Deleted = true;
            }
            else
            {
                db.Inserted = true;
            }

            int index = 0;

            foreach (var param in db.Params)
            {
                var ele = fact.Elements[index];
                index++;

                if (ele.Type == null)
                {
                    Context.Log.Error(ele.Location,
                                      DiagnosticCode.InternalError,
                                      "No type information available for fact argument");
                    continue;
                }

                VerifyParamCompatibility(db, index, param, ele);
            }
        }
Exemplo n.º 3
0
        private IRFact ASTFactToIR(ASTFact astFact)
        {
            var fact = new IRFact
            {
                Database = new IRSymbolRef(new FunctionNameAndArity(astFact.Database, astFact.Elements.Count)),
                Not      = astFact.Not,
                Elements = new List <IRConstant>(astFact.Elements.Count),
                Location = astFact.Location
            };

            foreach (var element in astFact.Elements)
            {
                fact.Elements.Add(ASTConstantToIR(element));
            }

            return(fact);
        }
Exemplo n.º 4
0
        private IRFact ASTFactToIR(IRGoal goal, ASTBaseFact astFact)
        {
            if (astFact is ASTFact)
            {
                var f    = astFact as ASTFact;
                var fact = new IRFact
                {
                    Database = new IRSymbolRef(new FunctionNameAndArity(f.Database, f.Elements.Count)),
                    Not      = f.Not,
                    Elements = new List <IRConstant>(f.Elements.Count),
                    Goal     = null,
                    Location = f.Location
                };

                foreach (var element in f.Elements)
                {
                    fact.Elements.Add(ASTConstantToIR(element));
                }

                return(fact);
            }
            else if (astFact is ASTGoalCompletedFact)
            {
                var f = astFact as ASTGoalCompletedFact;
                return(new IRFact
                {
                    Database = null,
                    Not = false,
                    Elements = new List <IRConstant>(),
                    Goal = goal,
                    Location = f.Location
                });
            }
            else
            {
                throw new InvalidOperationException("Cannot convert unknown AST fact type to IR");
            }
        }
Exemplo n.º 5
0
 private void PropagateRuleTypes(IRFact fact)
 {
     PropagateSignatureIfRequired(fact.Database.Name, FunctionType.Database, fact.Elements);
 }