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); }