public override IAstNode VisitAssignRecStmt(MicroCParser.AssignRecStmtContext context)
        {
            var            label       = ++_label;
            string         name        = context.IDENT().GetText();
            IList <IAExpr> expressions = context.a_expr().Select(x => Visit(x) as IAExpr).ToList();

            var symbol = _symbolTable.LookupSymbol(name);

            if (symbol.Size != expressions.Count)
            {
                throw new ArgumentException(
                          $"Cannot assign {expressions.Count} values to record of size {symbol.Size}");
            }

            var children = _recordDecls.First(r => r.Id == symbol.Id).Fields.ToList();
            var ident    = new Identifier(name, symbol.Type, symbol.Id);

            ident.Children = children;

            // TODO: Type check the symbol

            var recAssignStmt = new RecAssignStmt(ident, expressions);

            recAssignStmt.Label = label;
            return(recAssignStmt);
        }
示例#2
0
        private IADomain RecAssignTransfer(RecAssignStmt recAssignStmt, IADomain domain)
        {
            var newDomain = CopyDomain(domain);

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

            for (int i = 0; i < recAssignStmt.Left.Children.Count; i++)
            {
                var ident = recAssignStmt.Left.Children[i];
                var expr  = recAssignStmt.Right[i];

                var newInterval = IAUtil.Arithmetic(expr, domain);
                if (newInterval.IsBottom)
                {
                    return(Bottom().GetDomain());
                }

                newDomain[ident] = newInterval.ToIntervalK(_program);
            }

            return(newDomain);
        }
示例#3
0
        private FVDomain RecAssignTransfer(RecAssignStmt recAssignStmt, FVDomain domain)
        {
            // This needs to be the children of the record
            var ident = recAssignStmt.Left;

            if (!domain.Contains(ident))
            {
                return(domain);
            }

            var fv = recAssignStmt.Right.SelectMany(e => AnalysisUtil.FreeVariables(e));

            return(domain.Except(ident.Singleton()).Union(fv).ToFVDomain());
        }
示例#4
0
        private DSDomain RecAssignTransfer(RecAssignStmt recAssignStmt, DSDomain domain)
        {
            var newDomain = CopyDomain(domain);

            for (int i = 0; i < recAssignStmt.Left.Children.Count; i++)
            {
                var ident = recAssignStmt.Left.Children[i];
                var expr  = recAssignStmt.Right[i];

                newDomain[ident] = DSUtil.Arithmetic(expr, domain);
            }

            return(newDomain);
        }
示例#5
0
        protected override ILattice <FVDomain> TransferFunctions(int label)
        {
            var block     = GetBlock(label);
            var domain    = _analysisCircle[label].GetDomain();
            var newDomain = block switch
            {
                AssignStmt assignStmt => AssignTransfer(assignStmt, domain),
                RecAssignStmt recAssignStmt => RecAssignTransfer(recAssignStmt, domain),
                IfStmt ifStmt => ConditionTransfer(ifStmt.Condition, domain),
                IfElseStmt ifElseStmt => ConditionTransfer(ifElseStmt.Condition, domain),
                WhileStmt whileStmt => ConditionTransfer(whileStmt.Condition, domain),
                WriteStmt writeStmt => WriteTransfer(writeStmt, domain),
                ReadStmt readStmt => ReadTransfer(readStmt, domain),
                _ => new FVDomain(),
            };

            return(new FVLattice(newDomain));
        }
示例#6
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));
        }