static BoolExpr Make(ref List <Token> .Enumerator polishNotationTokensEnumerator) { if (polishNotationTokensEnumerator.Current == null) { throw new ArgumentNullException(); } if (polishNotationTokensEnumerator.Current.Type == Token.TokenType.Literal) { var lit = BoolExpr.CreateBoolVar(polishNotationTokensEnumerator.Current.Value); polishNotationTokensEnumerator.MoveNext(); return(lit); } switch (polishNotationTokensEnumerator.Current.Value) { case "NOT": { polishNotationTokensEnumerator.MoveNext(); var operand = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateNot(operand)); } case "AND": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateAnd(left, right)); } case "OR": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateOr(left, right)); } case "IF": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateIf(left, right)); } case "IFONLYIF": { polishNotationTokensEnumerator.MoveNext(); var left = Make(ref polishNotationTokensEnumerator); var right = Make(ref polishNotationTokensEnumerator); return(BoolExpr.CreateIfOnlyIf(left, right)); } } return(null); }