예제 #1
0
        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);
        }