Ejemplo n.º 1
0
        public ArmadaPC GenerateOnePC()
        {
            int pcVal = numPCs;

            ++numPCs;
            var pc = new ArmadaPC(symbols, method.Name, pcVal);

            symbols.AssociateLabelWithPC(pcVal.ToString(), pc);
            return(pc);
        }
Ejemplo n.º 2
0
        public void ParseMethodBody(ArmadaSymbolTable symbols)
        {
            var parse = new ParseInfo(prog, symbols, this);

            parsedBody = ArmadaStatement.ParseStatement(parse, method.Body);
            var startPC = GenerateOnePC();

            returnPC = parsedBody.AssignPCs(startPC);

            ArmadaStatement.ComputeNonyieldingPCs(parsedBody, nonyieldingPCs);

            symbols.AssociateLabelWithPC("Start", startPC);
            symbols.AssociateLabelWithPC("End", returnPC);
            foreach (var statement in parsedBody)
            {
                statement.AssociateLabelsWithPCs();
                statement.GenerateEnablingConstraints();
            }
        }
Ejemplo n.º 3
0
        public void ParseMethodBody(ArmadaSymbolTable symbols)
        {
            var context = new ParseContext(prog, symbols, this);

            parsedBody = ArmadaStatement.ParseStatement(context, method.Body);
            var startPC = GenerateOnePC();
            var endPC   = parsedBody.AssignPCs(prog, symbols, this, startPC);

            ArmadaStatement.CollectReturnPCs(parsedBody, returnPCs);
            ArmadaStatement.ComputeNonyieldingPCs(parsedBody, nonyieldingPCs);

            foreach (var statement in parsedBody)
            {
                if (statement is ArmadaAssumeStatement)
                {
                    var s        = (ArmadaAssumeStatement)statement;
                    var assumePC = s.StartPC;
                    if (!constraints.ContainsKey(assumePC))
                    {
                        constraints[assumePC] = new EnablingConstraintCollector(prog);
                    }
                    s.AddEnablingConstraint(symbols, this, constraints[assumePC]);
                }
            }

            symbols.AssociateLabelWithPC("Start", startPC);
            symbols.AssociateLabelWithPC("End", endPC);
            foreach (var statement in parsedBody)
            {
                var stmt = statement.Stmt;
                if (stmt != null)
                {
                    for (var lbl = stmt.Labels; lbl != null; lbl = lbl.Next)
                    {
                        if (lbl.Data != null && lbl.Data.Name != null)
                        {
                            symbols.AssociateLabelWithPC(lbl.Data.Name, statement.StartPC);
                        }
                    }
                }
            }
        }