diff --git a/main.py b/main.py index 629a77e..7f6a543 100755 --- a/main.py +++ b/main.py @@ -409,40 +409,52 @@ def evaluate(expr): return ~evaluate(subexp) & M; case (first, "||", *rest): result = evaluate(first); - for subexpr in rest[::2]: - subresult = evaluate(subexpr); - result = result | subresult; + for subexpr in rest[::2]: result = result | evaluate(subexpr); + return result; + case (first, "!|", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = ~(result | evaluate(subexpr)) & M; + return result; + case (first, "|!", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = (~result | evaluate(subexpr)) & M; return result; -# case (left, "!|", right): -# return ~(evaluate(left) | evaluate(right)) & M; -# case (left, "|!", right): -# return (~evaluate(left) | evaluate(right)) & M; case (first, "&&", *rest): result = evaluate(first); - for subexpr in rest[::2]: - subresult = evaluate(subexpr); - result = result & subresult; + for subexpr in rest[::2]: result = result & evaluate(subexpr); + return result; + case (first, "!&", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = ~(result & evaluate(subexpr)) & M; + return result; + case (first, "&!", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = (~result & evaluate(subexpr)) & M; + return result; + case (first, "<", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = (~result & evaluate(subexpr)) & M; + return result; + case (first, "<=", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = (~result | evaluate(subexpr)) & M; + return result; + case (first, ">", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = (result & ~evaluate(subexpr)) & M; + return result; + case (first, ">=", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = (result | ~evaluate(subexpr)) & M; + return result; + case (first, "!=", *rest): + result = evaluate(first); + for subexpr in rest[::2]: result = (result ^ evaluate(subexpr)) & M return result; -# case (left, "!&", right): -# return ~(evaluate(left) & evaluate(right)) & M; -# case (left, "&!", right): -# return (~evaluate(left) & evaluate(right)) & M; -# case (left, "<", right): -# return (~evaluate(left) & evaluate(right)) & M; -# case (left, "<=", right): -# return (~evaluate(left) | evaluate(right)) & M; -# case (left, ">", right): -# return (evaluate(left) & ~evaluate(right)) & M; -# case (left, ">=", right): -# return (evaluate(left) | ~evaluate(right)) & M; case (first, "==", *rest): result = evaluate(first); - for subexpr in rest[::2]: - subresult = evaluate(subexpr); - result = ~(result ^ subresult) & M + for subexpr in rest[::2]: result = ~(result ^ evaluate(subexpr)) & M return result; -# case (left, "!=", right): -# return evaluate(left) ^ evaluate(right); case _: print(expr); assert(not "TODO");