예제 #1
0
        private DSDomain IntDeclTransfer(IntDecl intDecl, DSDomain domain)
        {
            var ident = new Identifier(intDecl.Name, VarType.Int, intDecl.Id);

            var newDomain = CopyDomain(domain);

            newDomain[ident] = DSSign.Zero.Singleton().ToHashSet();
            return(newDomain);
        }
예제 #2
0
        public override IAstNode VisitIntDecl(MicroCParser.IntDeclContext context)
        {
            var label   = ++_label;
            var name    = context.IDENT().GetText();
            var id      = _symbolTable.InsertSymbol(name, VarType.Int);
            var intDecl = new IntDecl(name);

            intDecl.Label = label;
            intDecl.Id    = id;
            return(intDecl);
        }
예제 #3
0
        private IADomain IntDeclTransfer(IntDecl intDecl, IADomain domain)
        {
            var newDomain = CopyDomain(domain);

            if (domain.IsBottom())
            {
                return(newDomain);
            }

            var ident = new Identifier(intDecl.Name, VarType.Int, intDecl.Id);

            newDomain[ident] = new Interval(new ExtendedZ(0), new ExtendedZ(0)).ToIntervalK(_program);

            return(newDomain);
        }
예제 #4
0
        protected override ILattice <IADomain> TransferFunctions(int label)
        {
            var block     = GetBlock(label);
            var domain    = _analysisCircle[label].GetDomain();
            var newDomain = block switch
            {
                IntDecl intDecl => IntDeclTransfer(intDecl, domain),
                ArrayDecl arrayDecl => ArrayDeclTransfer(arrayDecl, domain),
                RecordDecl recordDecl => RecDeclTransfer(recordDecl, domain),
                AssignStmt assignStmt => AssignTransfer(assignStmt, domain),
                RecAssignStmt recAssignStmt => RecAssignTransfer(recAssignStmt, domain),
                IfStmt ifStmt => IdTransfer(ifStmt, domain),
                IfElseStmt ifElseStmt => IdTransfer(ifElseStmt, domain),
                WhileStmt whileStmt => IdTransfer(whileStmt, domain),
                WriteStmt writeStmt => IdTransfer(writeStmt, domain),
                ReadStmt readStmt => ReadTransfer(readStmt, domain),
                _ => Bottom().GetDomain(),
            };

            return(new IALattice(newDomain));
        }