parser update

This commit is contained in:
2026-04-13 11:12:33 +02:00
parent 2ff205027c
commit 50550a1f06
2 changed files with 10 additions and 7 deletions
+4
View File
@@ -8,6 +8,10 @@ input:
``` ```
!X11 AND (!X3 AND !X4 OR X3 AND X4 OR X3 AND !X4 AND X12) OR X11 AND !X12 AND (X3 OR X4) !X11 AND (!X3 AND !X4 OR X3 AND X4 OR X3 AND !X4 AND X12) OR X11 AND !X12 AND (X3 OR X4)
``` ```
input (using '+' for or and '*' for and):
```
!X11*(!X3*!X4+X3*X4+X3*!X4*X12)+X11*!X12*(X3+X4)
```
output: output:
``` ```
+6 -7
View File
@@ -69,6 +69,7 @@ TOKEN_RE = re.compile(
\s*( \s*(
\(|\)| \(|\)|
!| !|
\+|\*|
AND|OR| AND|OR|
0|1| 0|1|
X\d+| X\d+|
@@ -81,8 +82,7 @@ TOKEN_RE = re.compile(
def tokenize(s: str) -> List[str]: def tokenize(s: str) -> List[str]:
tokens = TOKEN_RE.findall(s) tokens = TOKEN_RE.findall(s)
stripped = re.sub(r"\s+", "", s) stripped = re.sub(r"\s+", "", s)
joined = "".join(tokens).replace("AND", "AND").replace("OR", "OR") if "".join(tokens) != stripped:
if re.sub(r"\s+", "", joined) != stripped:
raise ValueError(f"Invalid token near: {s!r}") raise ValueError(f"Invalid token near: {s!r}")
return tokens return tokens
@@ -128,17 +128,16 @@ class Parser:
def parse_or(self) -> Poly: def parse_or(self) -> Poly:
left = self.parse_and() left = self.parse_and()
while self.peek() == "OR": while self.peek() in ("OR", "+"):
self.eat("OR") self.eat()
right = self.parse_and() right = self.parse_and()
# A OR B = A XOR B XOR (A AND B)
left = poly_xor(poly_xor(left, right), poly_and(left, right)) left = poly_xor(poly_xor(left, right), poly_and(left, right))
return left return left
def parse_and(self) -> Poly: def parse_and(self) -> Poly:
left = self.parse_not() left = self.parse_not()
while self.peek() == "AND": while self.peek() in ("AND", "*"):
self.eat("AND") self.eat()
right = self.parse_not() right = self.parse_not()
left = poly_and(left, right) left = poly_and(left, right)
return left return left