Beispiel #1
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);
        }