parser update
This commit is contained in:
@@ -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:
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user