Пример #1
0
 public CFGNodeProcedure(CommonAST StatementAST)
 {
     NodeASTSubTree     = StatementAST;
     m_LocalVariables   = new Variables();
     m_FormalParameters = new Variables();
     m_Succesor         = new List <CFGNode>();
 }
Пример #2
0
        public formattedCodeView getFormattedProgram()
        {
            formattedCodeView formattedProgram = new formattedCodeView();

            CommonAST walker = BoolProgramAst;

            while ((walker != null) && (walker.Type == BoolParserTokenTypes.LITERAL_decl))
            {
                formattedProgram.addLine(HelperFunctions.DeclToString(walker));

                walker = (CommonAST)walker.getNextSibling();
            }

            formattedProgram.addLine("");

            while ((walker != null) && (walker.Type == BoolParserTokenTypes.PROC))
            {
                formattedProgram = getFormattedProcedure(walker, formattedProgram);

                formattedProgram.addLine("");

                walker = (CommonAST)walker.getNextSibling();
            }

            return(formattedProgram);
        }
Пример #3
0
        public static void BuildDeciderTransfers(CommonAST decider, BddManager Manager,
                                                 Dictionary <string, int> LocalVarToId, Dictionary <string, int> GlobalVarToId,
                                                 out Bdd TransferTrue, out Bdd TransferFalse)
        {
            Bdd identity = BuildIdentityTransfer(Manager, LocalVarToId, GlobalVarToId);

            Debug.Assert(decider.Type == BoolParserTokenTypes.DECIDER);

            CommonAST walker = decider.getFirstChild() as CommonAST;

            if (walker.Type == BoolParserTokenTypes.QMARK)
            {
                TransferTrue  = identity;
                TransferFalse = identity;
            }
            else
            {
                Debug.Assert(walker.Type == BoolParserTokenTypes.EXPR);

                Bdd expr = ExprToBdd(walker, Manager, LocalVarToId, GlobalVarToId);

                TransferTrue  = Manager.LogicalAnd(Manager.LogicalXnor(expr, Manager.CreateBddOne()), identity);
                TransferFalse = Manager.LogicalAnd(Manager.LogicalXnor(expr, Manager.CreateBddZero()), identity);

                identity.FreeBdd();
                expr.FreeBdd();
            }
        }
Пример #4
0
        private List <SemanticError> CheckExpression(CommonAST EXPR, List <SemanticError> Errors,
                                                     List <string> LocalVariables, string ProcOf)
        {
            CommonAST walker = (CommonAST)EXPR.getFirstChild();

            while (walker != null)
            {
                switch (walker.Type)
                {
                case (BoolParserTokenTypes.ID):
                    if (!(LocalVariables.Contains(walker.getText())) &&
                        !(GlobalVariables.Contains(walker.getText())))
                    {
                        Errors.Add(new SemanticError(BoolSemanticErrorTypes.VAR_UNDECLARED,
                                                     walker.getText(), ProcOf));
                    }
                    break;

                case (BoolParserTokenTypes.EXPR):
                    Errors = CheckExpression(walker, Errors, LocalVariables, ProcOf);
                    break;
                }

                walker = (CommonAST)walker.getNextSibling();
            }

            return(Errors);
        }
Пример #5
0
        public static string DeclToString(CommonAST Decl)
        {
            Debug.Assert(Decl != null);

            string output = "decl ";

            Decl = (CommonAST)Decl.getFirstChild();
            bool first = true;

            while (Decl != null)
            {
                if (!first)
                {
                    output = output + ", ";
                }
                output = output + Decl.getText();

                Decl  = (CommonAST)Decl.getNextSibling();
                first = false;
            }

            output = output + ";";

            return(output);
        }
Пример #6
0
        public Graph GetASTasGLEEGraph()
        {
            Graph g = new Graph("AST");

            g.GraphAttr.NodeAttr.Padding = 3;

            CommonAST BoolProgramASTRoot = new CommonAST();

            BoolProgramASTRoot.setText("Bool Program");
            BoolProgramASTRoot.addChild(BoolProgAST);

            ASTforGLEEIndex = 0;
            if (ASTorderedByGraphIndex == null)
            {
                ASTorderedByGraphIndex = new List <CommonAST>();
            }
            else
            {
                ASTorderedByGraphIndex.Clear();
            }

            DrawAST(BoolProgramASTRoot, ref g);

            return(g);
        }
Пример #7
0
        public override string ToString()
        {
            CommonAST walker = (CommonAST)NodeASTSubTree.getFirstChild();

            string Text = m_Label + walker.getText();

            walker = (CommonAST)walker.getNextSibling();

            while (walker.Type != BoolParserTokenTypes.ASSIGN)
            {
                Text  += "," + walker.getText();
                walker = (CommonAST)walker.getNextSibling();
            }
            Text  += ":=";
            walker = (CommonAST)walker.getNextSibling();
            while (walker != null)
            {
                Text += HelperFunctions.ExprToString(walker);
                if (walker.getNextSibling() != null)
                {
                    Text += ",";
                }
                walker = (CommonAST)walker.getNextSibling();
            }
            Text += ';';

            return(Text);
        }
Пример #8
0
        public BoolProgramChecker(CommonAST ProgramAST)
        {
            BoolProgram = ProgramAST;

            GlobalVariables     = new List <string>();
            ProcedureNames      = new List <string>();
            ProcedureToNumParam = new Dictionary <string, int>();
        }
Пример #9
0
        private formattedCodeView getFormattedSSEQ(CommonAST sseq, formattedCodeView formattedCode, string tab)
        {
            CommonAST walker = (CommonAST)sseq.getFirstChild();

            while (walker != null)
            {
                CommonAST statement;
                if (walker.Type == BoolParserTokenTypes.STMT)
                {
                    statement = (CommonAST)walker.getFirstChild();
                }
                else
                {
                    statement = (CommonAST)walker.getFirstChild().getNextSibling();
                }

                CFGNode stmtNode;
                if (AstToCfgMapping.TryGetValue(walker, out stmtNode))
                {
                    if ((stmtNode is CFGNodeStmtIf) || (stmtNode is CFGNodeStmtWhile))
                    {
                        if (stmtNode is CFGNodeStmtIf)
                        {
                            string line = tab + stmtNode.ToString() + " then";
                            formattedCode.addLine(line, stmtNode);

                            statement     = (CommonAST)statement.getFirstChild().getNextSibling();
                            formattedCode = getFormattedSSEQ(statement, formattedCode, tab + "  ");

                            formattedCode.addLine(tab + "else");

                            statement     = (CommonAST)statement.getNextSibling();
                            formattedCode = getFormattedSSEQ(statement, formattedCode, tab + "  ");

                            formattedCode.addLine(tab + "fi");
                        }
                        else
                        {
                            formattedCode.addLine(tab + stmtNode.ToString(), stmtNode);
                            formattedCode.addLine(tab + "do");

                            statement     = (CommonAST)statement.getFirstChild().getNextSibling();
                            formattedCode = getFormattedSSEQ(statement, formattedCode, tab + "  ");

                            formattedCode.addLine(tab + "od");
                        }
                    }
                    else
                    {
                        formattedCode.addLine(tab + stmtNode.ToString(), stmtNode);
                    }
                }

                walker = (CommonAST)walker.getNextSibling();
            }

            return(formattedCode);
        }
Пример #10
0
        override public string ToString()
        {
            string    Text   = m_Label + "assert(";
            CommonAST walker = (CommonAST)NodeASTSubTree.getFirstChild();

            Text += HelperFunctions.DeciderToString(walker);
            Text += ");";

            return(Text);
        }
Пример #11
0
        //This Procedure assumes Procedure is a PROC AST node
        private List <SemanticError> CheckProcedure(CommonAST Procedure, List <SemanticError> Errors)
        {
            List <string> LocalVariables = new List <string>();

            CommonAST walker = Procedure;

            walker = (CommonAST)walker.getFirstChild();
            string ProcedureName = walker.getText();

            walker = (CommonAST)walker.getFirstChild();

            #region Variables checking
            while (walker.Type == BoolParserTokenTypes.ID)
            {
                string variable = walker.ToString();
                if (LocalVariables.Contains(variable))
                {
                    Errors.Add(new SemanticError(BoolSemanticErrorTypes.VAR_NAME_CLASH, variable, ProcedureName));
                }
                else
                {
                    LocalVariables.Add(variable);
                }

                walker = (CommonAST)walker.getNextSibling();
            }

            while ((walker.Type == BoolParserTokenTypes.LITERAL_decl))
            {
                CommonAST subWalker = (CommonAST)walker.getFirstChild();

                while (subWalker != null)
                {
                    string variable = subWalker.ToString();
                    if (LocalVariables.Contains(variable))
                    {
                        Errors.Add(new SemanticError(BoolSemanticErrorTypes.VAR_NAME_CLASH, variable, ProcedureName));
                    }
                    else
                    {
                        LocalVariables.Add(variable);
                    }

                    subWalker = (CommonAST)subWalker.getNextSibling();
                }

                walker = (CommonAST)walker.getNextSibling();
            }
            #endregion


            Errors = CheckSSEQ(walker, Errors, LocalVariables, ProcedureName);

            return(Errors);
        }
Пример #12
0
 public static string DeciderToString(CommonAST Decider)
 {
     Decider = (CommonAST)Decider.getFirstChild();
     if (Decider.Type == BoolParserTokenTypes.EXPR)
     {
         return(HelperFunctions.ExprToString(Decider));
     }
     else
     {
         return(Decider.getText());
     }
 }
        public override string ToString()
        {
            string    Text   = m_Label + "print(";
            CommonAST walker = (CommonAST)NodeASTSubTree.getFirstChild();

            while (walker != null)
            {
                Text += HelperFunctions.ExprToString(walker);
                if (walker.getNextSibling() != null)
                {
                    Text += ",";
                }
                walker = (CommonAST)walker.getNextSibling();
            }
            Text += ");";

            return(Text);
        }
Пример #14
0
        private int DrawAST(CommonAST AST, ref Graph g)
        {
            if (AST != null)
            {
                int thisNodeIndex = ASTforGLEEIndex++;

                ASTorderedByGraphIndex.Add(AST);

                Node thisNode = (Node)g.AddNode(thisNodeIndex.ToString());
                thisNode.Attr.Label = AST.getText();

                CommonAST ChildAST = (CommonAST)AST.getFirstChild();

                int previousChildIndex = -1;

                for (int i = 0; i < AST.getNumberOfChildren(); i++)
                {
                    int childIndex = DrawAST(ChildAST, ref g);

                    if (childIndex != -1)
                    {
                        g.AddEdge(thisNodeIndex.ToString(), childIndex.ToString());

                        /*                        if (previousChildIndex != -1)
                         *                      {
                         *                          Edge SiblingEdge = (Edge)g.AddEdge(previousChildIndex.ToString(),
                         *                                                              childIndex.ToString());
                         *                          SiblingEdge.Attr.Styles = new Style[] { Microsoft.Glee.Drawing.Style.Dashed };
                         *                      }
                         */
                    }

                    previousChildIndex = childIndex;

                    ChildAST = (CommonAST)ChildAST.getNextSibling();
                }

                return(thisNodeIndex);
            }
            else
            {
                return(-1);
            }
        }
Пример #15
0
        public BMC()
        {
            CodeInput = new antlr.LexerSharedInputState(new StringReader(String.Empty));

            Lexer  = new BoolLexer(CodeInput);
            Parser = new BoolParser(Lexer);

            ErrorLog = String.Empty;

            BoolProgAST = (CommonAST)Parser.getAST();

            m_BddManager = new BddManager();

            ProgramCFG = new CFG(BoolProgAST, m_BddManager);

            m_PathEdges = new Dictionary <CFGNode, PathEdges>();

            m_SummaryEdges = new Dictionary <CFGNode, Bdd>();
        }
Пример #16
0
        private formattedCodeView getFormattedProcedure(CommonAST procedure, formattedCodeView formattedCode)
        {
            CommonAST walker = (CommonAST)procedure.getFirstChild();

            string procedureHead = string.Empty;

            procedureHead += walker.getText() + "(";
            walker         = (CommonAST)walker.getFirstChild();

            bool first = true;

            while (walker.Type == BoolParserTokenTypes.ID)
            {
                if (!first)
                {
                    procedureHead += ", ";
                }
                procedureHead += walker.getText();

                walker = (CommonAST)walker.getNextSibling();
                first  = false;
            }
            procedureHead += ")";

            formattedCode.addLine(procedureHead);
            formattedCode.addLine("begin");

            while (walker.Type == BoolParserTokenTypes.LITERAL_decl)
            {
                formattedCode.addLine("  " + HelperFunctions.DeclToString(walker));

                walker = (CommonAST)walker.getNextSibling();
            }

            formattedCode = getFormattedSSEQ(walker, formattedCode, "  ");

            formattedCode.addLine("end");

            return(formattedCode);
        }
Пример #17
0
        public static string ExprToString(CommonAST Expression)
        {
            Debug.Assert(Expression != null);

            string output = String.Empty;

            Expression = (CommonAST)Expression.getFirstChild();
            while (Expression != null)
            {
                if (Expression.Type != BoolParserTokenTypes.EXPR)
                {
                    output += Expression.getText();
                }
                else
                {
                    output += ExprToString(Expression);
                }

                Expression = (CommonAST)Expression.getNextSibling();
            }

            return(output);
        }
Пример #18
0
        public CFG(CommonAST BoolProgram, BddManager manager)
        {
            BoolProgramAst = BoolProgram;

            m_BddManager = manager;

            m_BddVariableToName = new List <string>(1000);
            m_BddVariableToName.Add("");

            ListOfCfgNodes = new List <CFGNode>();

            AstToCfgMapping = new Dictionary <CommonAST, CFGNode>();

            ASTParentByASTNode = new Dictionary <CommonAST, CommonAST>();

            LabelToStatement = new Dictionary <string, CFGNode>();

            ProcNameToNode = new Dictionary <string, CFGNodeProcedure>();

            m_GlobalVariables = new Variables();

            BuildCfgFromAst();
        }
Пример #19
0
 public Bdd GetExprBdd(int ASTIndex, out String Description)
 {
     if (ASTorderedByGraphIndex != null)
     {
         CommonAST Expression = ASTorderedByGraphIndex[ASTIndex];
         if (Expression.Type == BoolParserTokenTypes.EXPR)
         {
             Description = ControlFlowGraph.HelperFunctions.ExprToString(Expression);
             return(ControlFlowGraph.HelperFunctions.ExprToBdd(Expression, m_BddManager,
                                                               ProgramCFG.GlobalVariables.VariablesToId, ProgramCFG.GlobalVariables.VariablesToId));
         }
         else
         {
             Description = "Not an expression";
             return(null);
         }
     }
     else
     {
         Description = "N/A";
         return(null);
     }
 }
Пример #20
0
        public static CFGNodeStatement Make(CommonAST NodeAST)
        {
            switch (NodeAST.Type)
            {
            case BoolParserTokenTypes.LITERAL_skip:
                return(new CFGNodeStmtSkip(NodeAST));

            case BoolParserTokenTypes.LITERAL_print:
                return(new CFGNodeStmtPrint(NodeAST));

            case BoolParserTokenTypes.LITERAL_goto:
                return(new CFGNodeStmtGoto(NodeAST));

            case BoolParserTokenTypes.LITERAL_return:
                return(new CFGNodeStmtReturn(NodeAST));

            case BoolParserTokenTypes.ASSIGNMENT:
                return(new CFGNodeStmtAssignment(NodeAST));

            case BoolParserTokenTypes.LITERAL_if:
                return(new CFGNodeStmtIf(NodeAST));

            case BoolParserTokenTypes.LITERAL_while:
                return(new CFGNodeStmtWhile(NodeAST));

            case BoolParserTokenTypes.LITERAL_assert:
                return(new CFGNodeStmtAssert(NodeAST));

            case BoolParserTokenTypes.PROCCALL:
                return(new CFGNodeStmtProcCall(NodeAST));

            default:
                Debug.Assert(false);
                return(null);
            }
        }
Пример #21
0
        public static Bdd ExprToBdd(CommonAST Expr, BddManager Manager,
                                    Dictionary <string, int> LocalVarNameToId, Dictionary <string, int> GlobalVarNameToId)
        {
            Debug.Assert(Expr.Type == BoolParserTokenTypes.EXPR);

            Bdd ExprBdd = null;

            CommonAST walker = (CommonAST)Expr.getFirstChild();

            switch (walker.Type)
            {
            case BoolParserTokenTypes.EXPR:
                ExprBdd = ExprToBdd(walker, Manager, LocalVarNameToId, GlobalVarNameToId);
                break;

            case BoolParserTokenTypes.EMARK:
                walker = (CommonAST)walker.getNextSibling();

                Bdd tempBdd = ExprToBdd(walker, Manager, LocalVarNameToId, GlobalVarNameToId);
                ExprBdd = Manager.LogicalNot(tempBdd);

                tempBdd.FreeBdd();
                break;

            case BoolParserTokenTypes.ID:
                int VariableID;
                if (!LocalVarNameToId.TryGetValue(walker.getText(), out VariableID))
                {
                    if (!GlobalVarNameToId.TryGetValue(walker.getText(), out VariableID))
                    {
                        Debug.Assert(false);    //Varijabla mora biti ili medju lokalnim ili medju globalnim
                    }
                }
                ExprBdd = Manager.GetBddVariableWithID(VariableID);
                break;

            case BoolParserTokenTypes.CONST:
                if (walker.getText() == "1")
                {
                    ExprBdd = Manager.CreateBddOne();
                }
                else
                {
                    ExprBdd = Manager.CreateBddZero();
                }
                break;

            default:
                Debug.Assert(false);
                break;
            }

            if ((walker.getNextSibling() != null) &&
                ((walker = (CommonAST)walker.getNextSibling()).Type == BoolParserTokenTypes.BINOP))
            {
                Bdd firstOperand = ExprBdd;

                string Operation = walker.getText();
                walker = (CommonAST)walker.getNextSibling();

                Bdd secondOperand = ExprToBdd(walker, Manager, LocalVarNameToId, GlobalVarNameToId);

                switch (Operation)
                {
                case ("|"):
                    ExprBdd = Manager.LogicalOr(firstOperand, secondOperand);
                    break;

                case ("&"):
                    ExprBdd = Manager.LogicalAnd(firstOperand, secondOperand);
                    break;

                case ("^"):
                    ExprBdd = Manager.LogicalXor(firstOperand, secondOperand);
                    break;

                case ("="):
                    ExprBdd = Manager.LogicalXnor(firstOperand, secondOperand);
                    break;

                case ("!="):
                    ExprBdd = Manager.LogicalXor(firstOperand, secondOperand);
                    break;

                case ("=>"):
                    ExprBdd = Manager.LogicalImplies(firstOperand, secondOperand);
                    break;

                default:
                    Debug.Assert(false);
                    break;
                }

                firstOperand.FreeBdd();
                secondOperand.FreeBdd();
            }

            return(ExprBdd);
        }
Пример #22
0
        private void ExtractCfgNodes(CommonAST SubAst, CommonAST ParentAST, CFGNodeProcedure ProcOf)
        {
            while (SubAst != null)
            {
                ASTParentByASTNode.Add(SubAst, ParentAST);

                #region AST Nodes of type Statement
                if (SubAst.Type == BoolParserTokenTypes.STMT ||
                    SubAst.Type == BoolParserTokenTypes.LSTMT)
                {
                    if (!AstToCfgMapping.ContainsKey(SubAst))
                    {
                        CFGNodeStatement NewStatementNode;
                        if (SubAst.Type == BoolParserTokenTypes.STMT)
                        {
                            NewStatementNode = CFGStatementNodeFactory.Make((CommonAST)SubAst.getFirstChild());
                        }
                        else
                        {
                            NewStatementNode = CFGStatementNodeFactory.Make(
                                (CommonAST)SubAst.getFirstChild().getNextSibling());
                            NewStatementNode.setLabel(SubAst.getFirstChild().getText());
                            LabelToStatement.Add(SubAst.getFirstChild().getText(), NewStatementNode);
                        }
                        NewStatementNode.ProcOf = ProcOf;
                        ListOfCfgNodes.Add(NewStatementNode);
                        AstToCfgMapping.Add(SubAst, NewStatementNode);
                    }
                }

                #endregion
                #region AST Nodes of type Procedure
                if (SubAst.Type == BoolParserTokenTypes.PROC)
                {
                    if (!AstToCfgMapping.ContainsKey(SubAst))
                    {
                        CFGNodeProcedure NewStatementNode =
                            new CFGNodeProcedure((CommonAST)SubAst.getFirstChild());
                        ListOfCfgNodes.Add(NewStatementNode);
                        AstToCfgMapping.Add(SubAst, NewStatementNode);

                        ProcNameToNode.Add(SubAst.getFirstChild().getText(), NewStatementNode);

                        ProcOf = NewStatementNode;

                        //Inserting the function parameters into the procedure local variables list
                        CommonAST walker = (CommonAST)SubAst.getFirstChild().getFirstChild();
                        while (walker.Type == BoolParserTokenTypes.ID)
                        {
                            int varID = ProcOf.LocalVariables.AddVar(walker.getText(), m_BddManager, m_BddVariableToName);
                            ProcOf.FormalParameters.AddVar(walker.getText(), varID);
                            walker = (CommonAST)walker.getNextSibling();
                        }
                    }
                }

                #endregion
                #region AST Nodes of type Variable Declaration
                if (SubAst.Type == BoolParserTokenTypes.LITERAL_decl)
                {
                    CommonAST walker = (CommonAST)SubAst.getFirstChild();

                    while (walker != null)
                    {
                        if (ProcOf != null)
                        {
                            ProcOf.LocalVariables.AddVar(walker.getText(), m_BddManager, m_BddVariableToName);
                        }
                        else
                        {
                            m_GlobalVariables.AddVar(walker.getText(), m_BddManager, m_BddVariableToName);
                        }

                        walker = (CommonAST)walker.getNextSibling();
                    }
                }
                #endregion

                ExtractCfgNodes((CommonAST)SubAst.getFirstChild(), SubAst, ProcOf);

                SubAst = (CommonAST)SubAst.getNextSibling();
            }
        }
Пример #23
0
        private void BuildNextFunction()
        {
            foreach (CFGNode node in ListOfCfgNodes)
            {
                if (node is CFGNodeStatement)
                {
                    CFGNodeStatement stmt = (CFGNodeStatement)node;

                    CFGNode NextNode = null;

                    CommonAST ASTwalker = stmt.GetAST();
                    ASTParentByASTNode.TryGetValue(ASTwalker, out ASTwalker);

                    bool done = false;
                    while (!done && ASTwalker != null)
                    {
                        #region STMT or LSTMT
                        if (ASTwalker.Type == BoolParserTokenTypes.LITERAL_while)
                        {
                            done = true;
                            ASTParentByASTNode.TryGetValue(ASTwalker, out ASTwalker);
                            if (AstToCfgMapping.TryGetValue(ASTwalker, out NextNode))
                            {
                                stmt.Next = NextNode;
                            }
                            else
                            {
                                stmt.Next = null;
                            }
                        }
                        else
                        if ((ASTwalker.Type == BoolParserTokenTypes.STMT ||
                             ASTwalker.Type == BoolParserTokenTypes.LSTMT) &&
                            (ASTwalker.getNextSibling() != null))
                        {
                            CommonAST ASTwalkerSibling = (CommonAST)ASTwalker.getNextSibling();
                            if (ASTwalkerSibling.Type == BoolParserTokenTypes.STMT ||
                                ASTwalkerSibling.Type == BoolParserTokenTypes.LSTMT)
                            {
                                done = true;
                                if (AstToCfgMapping.TryGetValue(ASTwalkerSibling, out NextNode))
                                {
                                    stmt.Next = NextNode;
                                }
                                else
                                {
                                    stmt.Next = null;
                                }
                            }
                        }
                        #endregion

                        #region PROC
                        if (ASTwalker.Type == BoolParserTokenTypes.PROC)
                        {
                            done = true;
                            if (AstToCfgMapping.TryGetValue(ASTwalker, out NextNode))
                            {
                                stmt.Next = NextNode;
                            }
                            else
                            {
                                stmt.Next = null;
                            }
                        }
                        #endregion

                        if (!done)
                        {
                            ASTParentByASTNode.TryGetValue(ASTwalker, out ASTwalker);
                        }
                    }

                    if (stmt is CFGNodeStmtProcCall)
                    {
                        if (NextNode is CFGNodeStmtSkip)
                        {
                            (NextNode as CFGNodeStmtSkip).setPreviousProcCall(stmt as CFGNodeStmtProcCall);
                        }
                    }
                }
                else
                //We use this pass trough the CFG nodes to build "First Statement Of Procedure" function
                if (node is CFGNodeProcedure)
                {
                    CFGNodeProcedure proc = (CFGNodeProcedure)node;

                    CommonAST ASTwalker = proc.GetAST();

                    ASTwalker = (CommonAST)ASTwalker.getFirstChild();
                    while (ASTwalker.Type != BoolParserTokenTypes.SSEQ)
                    {
                        ASTwalker = (CommonAST)ASTwalker.getNextSibling();
                    }
                    ASTwalker = (CommonAST)ASTwalker.getFirstChild();

                    CFGNode FirstOf;
                    if (AstToCfgMapping.TryGetValue(ASTwalker, out FirstOf))
                    {
                        proc.FirstStmtOf = FirstOf;
                    }
                }
            }
        }
Пример #24
0
        private List <SemanticError> CheckSSEQ(CommonAST sseqAST, List <SemanticError> Errors,
                                               List <string> LocalVariables, string ProcOf)
        {
            CommonAST walker = (CommonAST)sseqAST.getFirstChild();

            while (walker != null)
            {
                CommonAST subWalker;

                CommonAST stmtWalker = (CommonAST)walker;
                if (stmtWalker.Type == BoolParserTokenTypes.LSTMT)
                {
                    stmtWalker = (CommonAST)stmtWalker.getFirstChild().getNextSibling();
                }
                else
                {
                    stmtWalker = (CommonAST)stmtWalker.getFirstChild();
                }

                switch (stmtWalker.Type)
                {
                case (BoolParserTokenTypes.LITERAL_print):
                    subWalker = (CommonAST)stmtWalker.getFirstChild();
                    while (subWalker != null)
                    {
                        Errors    = CheckExpression(subWalker, Errors, LocalVariables, ProcOf);
                        subWalker = (CommonAST)subWalker.getNextSibling();
                    }
                    break;

                case (BoolParserTokenTypes.ASSIGNMENT):
                    subWalker = (CommonAST)stmtWalker.getFirstChild();
                    while (subWalker != null)
                    {
                        switch (subWalker.Type)
                        {
                        case (BoolParserTokenTypes.ID):
                            if (!(LocalVariables.Contains(subWalker.getText())) &&
                                !(GlobalVariables.Contains(subWalker.getText())))
                            {
                                Errors.Add(new SemanticError(BoolSemanticErrorTypes.VAR_UNDECLARED,
                                                             subWalker.getText(), ProcOf));
                            }
                            break;

                        case (BoolParserTokenTypes.EXPR):
                            Errors = CheckExpression(subWalker, Errors, LocalVariables, ProcOf);
                            break;
                        }
                        subWalker = (CommonAST)subWalker.getNextSibling();
                    }
                    break;

                case (BoolParserTokenTypes.LITERAL_if):
                case (BoolParserTokenTypes.LITERAL_while):
                    subWalker = (CommonAST)stmtWalker.getFirstChild();
                    if (subWalker.getFirstChild().Type == BoolParserTokenTypes.EXPR)
                    {
                        Errors = CheckExpression((CommonAST)subWalker.getFirstChild(),
                                                 Errors, LocalVariables, ProcOf);
                    }
                    subWalker = (CommonAST)subWalker.getNextSibling();
                    Errors    = CheckSSEQ(subWalker, Errors, LocalVariables, ProcOf);
                    if (stmtWalker.Type == BoolParserTokenTypes.LITERAL_if)
                    {
                        subWalker = (CommonAST)subWalker.getNextSibling();
                        Errors    = CheckSSEQ(subWalker, Errors, LocalVariables, ProcOf);
                    }
                    break;

                case (BoolParserTokenTypes.LITERAL_assert):
                    subWalker = (CommonAST)stmtWalker.getFirstChild();
                    if (subWalker.getFirstChild().Type == BoolParserTokenTypes.EXPR)
                    {
                        Errors = CheckExpression((CommonAST)subWalker.getFirstChild(),
                                                 Errors, LocalVariables, ProcOf);
                    }
                    break;

                case (BoolParserTokenTypes.PROCCALL):
                    subWalker = (CommonAST)stmtWalker.getFirstChild();
                    if (ProcedureNames.Contains(subWalker.getText()))
                    {
                        //Checking for a required skip statement after a Procedure call
                        CommonAST afterProc = (CommonAST)walker.getNextSibling();
                        if (afterProc != null)
                        {
                            if (afterProc.Type == BoolParserTokenTypes.LSTMT)
                            {
                                afterProc = (CommonAST)afterProc.getFirstChild().getNextSibling();
                            }
                            else
                            {
                                afterProc = (CommonAST)afterProc.getFirstChild();
                            }
                        }
                        if ((afterProc == null) || (afterProc.Type != BoolParserTokenTypes.LITERAL_skip))
                        {
                            Errors.Add(new SemanticError(BoolSemanticErrorTypes.SKIP_EXPECTED,
                                                         subWalker.getText(), ProcOf));
                        }

                        string ProcCallName = subWalker.getText();
                        subWalker = (CommonAST)subWalker.getFirstChild();
                        int numParams = 0;
                        while (subWalker != null)
                        {
                            numParams++;
                            Errors    = CheckExpression(subWalker, Errors, LocalVariables, ProcOf);
                            subWalker = (CommonAST)subWalker.getNextSibling();
                        }
                        int realNumParams;
                        ProcedureToNumParam.TryGetValue(ProcCallName, out realNumParams);
                        if (numParams != realNumParams)
                        {
                            Errors.Add(new SemanticError(BoolSemanticErrorTypes.WRONG_PARAM_NUM,
                                                         ProcCallName, ProcOf));
                        }
                    }
                    else
                    {
                        Errors.Add(new SemanticError(BoolSemanticErrorTypes.PROC_UNDECLARED,
                                                     subWalker.getText(), ProcOf));
                    }
                    break;
                }

                walker = (CommonAST)walker.getNextSibling();
            }

            return(Errors);
        }
Пример #25
0
        public List <SemanticError> Check()
        {
            List <SemanticError> Errors = new List <SemanticError>();

            GlobalVariables.Clear();
            ProcedureNames.Clear();
            ProcedureToNumParam.Clear();

            CommonAST walker = BoolProgram;

            while ((walker != null) && (walker.Type == BoolParserTokenTypes.LITERAL_decl))
            {
                CommonAST subWalker = (CommonAST)walker.getFirstChild();

                while (subWalker != null)
                {
                    string variable = subWalker.ToString();
                    if (GlobalVariables.Contains(variable))
                    {
                        Errors.Add(new SemanticError(BoolSemanticErrorTypes.VAR_NAME_CLASH, variable));
                    }
                    else
                    {
                        GlobalVariables.Add(variable);
                    }

                    subWalker = (CommonAST)subWalker.getNextSibling();
                }

                walker = (CommonAST)walker.getNextSibling();
            }

            CommonAST procWalker = walker;

            while (walker != null)
            {
                string procName = walker.getFirstChild().getText();

                if (ProcedureNames.Contains(procName))
                {
                    Errors.Add(new SemanticError(BoolSemanticErrorTypes.PROC_NAME_CLASH, procName));
                }
                else
                {
                    ProcedureNames.Add(procName);
                    CommonAST subWalker = (CommonAST)walker.getFirstChild().getFirstChild();

                    int numParameters = 0;
                    while (subWalker.Type == BoolParserTokenTypes.ID)
                    {
                        numParameters++;
                        subWalker = (CommonAST)subWalker.getNextSibling();
                    }

                    ProcedureToNumParam.Add(procName, numParameters);
                }

                walker = (CommonAST)walker.getNextSibling();
            }

            while (procWalker != null)
            {
                Errors = CheckProcedure(procWalker, Errors);

                procWalker = (CommonAST)procWalker.getNextSibling();
            }

            if (!(ProcedureNames.Contains("main")))
            {
                Errors.Add(new SemanticError(BoolSemanticErrorTypes.MAIN_MISSING, ""));
            }

            return(Errors);
        }
 public CFGNodeStmtReturn(CommonAST StatementAST)
     : base(StatementAST)
 {
 }
Пример #27
0
 public CFGNodeStmtConditional(CommonAST StatementAST)
     : base(StatementAST)
 {
 }
 public CFGNodeStmtPrint(CommonAST StatementAST)
     : base(StatementAST)
 {
 }
Пример #29
0
        public bool ParseProgram(string BooleanProgram)
        {
            bool Succesful = true;

            try
            {
                ErrorLog = String.Empty;

                Lexer.resetState(new StringReader(BooleanProgram));
                Parser.resetState();

                StringWriter ErrorLogger = new StringWriter();
                Console.SetError(ErrorLogger);

                Parser.prog();

                ErrorLog = ErrorLogger.ToString();

                if (ErrorLog.Equals(String.Empty))
                {
                    ErrorLog   += "Syntax validation completed without errors.\n";
                    BoolProgAST = (CommonAST)Parser.getAST();
                }
                else
                {
                    Succesful = false;
                }
            }
            catch (TokenStreamException err)
            {
                ErrorLog += ("exception: " + err.ToString() + "\n");
                Succesful = false;
            }
            catch (RecognitionException err)
            {
                ErrorLog += ("exception: " + err.ToString() + "\n");
                Succesful = false;
            }

            if (Succesful)
            {
                BoolSemantics.BoolProgramChecker SemanticChecker =
                    new BoolSemantics.BoolProgramChecker(BoolProgAST);

                List <BoolSemantics.SemanticError> Errors = SemanticChecker.Check();

                if (Errors.Count == 0)
                {
                    ErrorLog += "Semantic validation completed without errors.\n";

                    BuildCFG();
                }
                else
                {
                    ErrorLog += "\n";
                    foreach (BoolSemantics.SemanticError Error in Errors)
                    {
                        ErrorLog += Error.ToString() + "\n";
                    }

                    BoolProgAST = null;
                }
            }

            return(Succesful);
        }
Пример #30
0
        private void BuildSuccesors()
        {
            foreach (CFGNode node in ListOfCfgNodes)
            {
                CommonAST nodeAST = node.GetAST();
                CFGNode   succNode;

                #region Succesors for Statements
                if (node is CFGNodeStatement)
                {
                    CFGNodeStatement stmtNode = (CFGNodeStatement)node;
                    switch (nodeAST.Type)
                    {
                    case BoolParserTokenTypes.LITERAL_goto:
                        nodeAST = (CommonAST)nodeAST.getFirstChild();
                        if (LabelToStatement.TryGetValue(nodeAST.getText(), out succNode))
                        {
                            stmtNode.AddSuccesor(succNode);
                        }
                        break;

                    case BoolParserTokenTypes.ASSIGNMENT:
                    case BoolParserTokenTypes.LITERAL_skip:
                    case BoolParserTokenTypes.LITERAL_print:
                        stmtNode.AddSuccesor(stmtNode.Next);
                        break;

                    case BoolParserTokenTypes.LITERAL_return:
                        stmtNode.AddSuccesor(stmtNode.ProcOf);
                        break;

                    case BoolParserTokenTypes.LITERAL_if:
                        nodeAST = (CommonAST)nodeAST.getFirstChild();
                        nodeAST = (CommonAST)nodeAST.getNextSibling();
                        if (AstToCfgMapping.TryGetValue(nodeAST.getFirstChild() as CommonAST, out succNode))
                        {
                            (stmtNode as CFGNodeStmtIf).TrueSuccesor = succNode;
                        }
                        nodeAST = (CommonAST)nodeAST.getNextSibling();
                        if (AstToCfgMapping.TryGetValue(nodeAST.getFirstChild() as CommonAST, out succNode))
                        {
                            (stmtNode as CFGNodeStmtIf).FalseSuccesor = succNode;
                        }
                        break;

                    case BoolParserTokenTypes.LITERAL_while:
                        nodeAST = (CommonAST)nodeAST.getFirstChild();
                        nodeAST = (CommonAST)nodeAST.getNextSibling();
                        nodeAST = (CommonAST)nodeAST.getFirstChild();
                        if (AstToCfgMapping.TryGetValue(nodeAST, out succNode))
                        {
                            (stmtNode as CFGNodeStmtWhile).TrueSuccesor = succNode;
                        }
                        (stmtNode as CFGNodeStmtWhile).FalseSuccesor = stmtNode.Next;
                        break;

                    case BoolParserTokenTypes.LITERAL_assert:
                        (stmtNode as CFGNodeStmtAssert).FalseSuccesor = ErrorNode;
                        (stmtNode as CFGNodeStmtAssert).TrueSuccesor  = stmtNode.Next;
                        break;

                    case BoolParserTokenTypes.PROCCALL:
                        nodeAST = (CommonAST)nodeAST.getFirstChild();
                        CFGNodeProcedure procNode;
                        if (ProcNameToNode.TryGetValue(nodeAST.getText(), out procNode))
                        {
                            stmtNode.AddSuccesor(procNode.FirstStmtOf);
                        }

                        //Exit points of procedures need to be filled when processing all procedure calls
                        procNode.AddSuccesor(stmtNode.Next);
                        break;

                    default:
                        System.Diagnostics.Debug.Assert(false);
                        break;
                    }
                }
                #endregion
                //Succesors for Procedure Exits are built when processing Procedure calls
            }
        }