parser update

This commit is contained in:
sam.hadow committed 2026-04-13 11:12:33 +02:00
1 parent 2ff205027c
commit 50550a1f06
2 files changed
+10 -7

No files matched your search

+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