From 3f93c074efe698ece02e2520e96f500d53b7729c Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Mon, 18 May 2026 14:46:35 +0200 Subject: [PATCH] modify parser --- pyproject.toml | 1 + src/anf/parser.py | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a392ba7..774c759 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,3 +10,4 @@ anf = "anf.cli:main" [tool.pytest.ini_options] testpaths = ["tests"] +pythonpath = ["src"] diff --git a/src/anf/parser.py b/src/anf/parser.py index 1ff3617..f70aff5 100644 --- a/src/anf/parser.py +++ b/src/anf/parser.py @@ -10,8 +10,9 @@ TOKEN_RE = re.compile( \s*( \(|\)| !| - \+|\*| - AND|OR| + OR|XOR| + \+|⊕| + AND|\*|⸱| 0|1| X\d+| [A-Za-z_][A-Za-z0-9_]* @@ -53,16 +54,24 @@ class Parser: return p def parse_or(self) -> Poly: - left = self.parse_and() + left = self.parse_xor() while self.peek() in ("OR", "+"): self.eat() - right = self.parse_and() + right = self.parse_xor() left = poly_xor(poly_xor(left, right), poly_and(left, right)) return left + def parse_xor(self) -> Poly: + left = self.parse_and() + while self.peek() in ("XOR", "⊕"): + self.eat() + right = self.parse_and() + left = poly_xor(left, right) + return left + def parse_and(self) -> Poly: left = self.parse_not() - while self.peek() in ("AND", "*"): + while self.peek() in ("AND", "*", "⸱"): self.eat() right = self.parse_not() left = poly_and(left, right)