From 50550a1f06fbc4e9e1d456f0e1b4fc1849ad6009 Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Mon, 13 Apr 2026 11:12:33 +0200 Subject: [PATCH] parser update --- README.md | 4 ++++ anf.py | 13 ++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a80a935..58e4590 100644 --- a/README.md +++ b/README.md @@ -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) ``` +input (using '+' for or and '*' for and): +``` +!X11*(!X3*!X4+X3*X4+X3*!X4*X12)+X11*!X12*(X3+X4) +``` output: ``` diff --git a/anf.py b/anf.py index 3057a83..5c9293d 100644 --- a/anf.py +++ b/anf.py @@ -69,6 +69,7 @@ TOKEN_RE = re.compile( \s*( \(|\)| !| + \+|\*| AND|OR| 0|1| X\d+| @@ -81,8 +82,7 @@ TOKEN_RE = re.compile( def tokenize(s: str) -> List[str]: tokens = TOKEN_RE.findall(s) stripped = re.sub(r"\s+", "", s) - joined = "".join(tokens).replace("AND", "AND").replace("OR", "OR") - if re.sub(r"\s+", "", joined) != stripped: + if "".join(tokens) != stripped: raise ValueError(f"Invalid token near: {s!r}") return tokens @@ -128,17 +128,16 @@ class Parser: def parse_or(self) -> Poly: left = self.parse_and() - while self.peek() == "OR": - self.eat("OR") + while self.peek() in ("OR", "+"): + self.eat() 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)) return left def parse_and(self) -> Poly: left = self.parse_not() - while self.peek() == "AND": - self.eat("AND") + while self.peek() in ("AND", "*"): + self.eat() right = self.parse_not() left = poly_and(left, right) return left