-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexpression_parser.py
61 lines (47 loc) · 1.63 KB
/
expression_parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import re
import itertools
def NOT(a):
return not a
def AND(a ,b):
return a & b
def OR(a, b):
return a | b
def extract_vars(expression):
return sorted(set(re.findall(r'[A-Za-z][A-Za-z0-9]*', expression)))
def parse_boolean_expression(expression):
tokens = re.findall(r'[A-Za-z][A-Za-z0-9]*|[\&|!()]', expression)
def evaluate_expression(tokens):
def parse_literal():
token = tokens.pop(0)
if token == '(':
result = parse_cube()
tokens.pop(0)
return result
elif token == '!':
return f'NOT({parse_literal()})'
return token
def parse_cube():
result = parse_literal()
while tokens and tokens[0] in '&|!':
op = tokens.pop(0)
if op == '&':
result = f'AND({result}, {parse_literal()})'
elif op == '|':
result = f'OR({result}, {parse_literal()})'
return result
return parse_cube()
return evaluate_expression(tokens)
def solve_bool_expression(expr, values):
for var, value in values.items():
expr = re.sub(rf'\b{var}\b', str(value), expr)
return eval(expr)
def get_minterms(expression):
minterms = []
vars = extract_vars(expression)
bool_expr = parse_boolean_expression(expression)
tt_values = list(itertools.product([0, 1], repeat=len(vars)))
for value in tt_values:
vars_values = dict(zip(vars, value))
if solve_bool_expression(bool_expr, vars_values):
minterms.append(value)
return minterms