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)