-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvalidator.py
More file actions
93 lines (71 loc) · 2.86 KB
/
validator.py
File metadata and controls
93 lines (71 loc) · 2.86 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class Validator(object):
def __init__(self, operators, characters):
self.operators = operators
self.characters = characters
def validate(self, ex):
## & - conjunction,
## | - alternative,
## ^ - xor,
## ~ - negation,
## > - implication,
## = - equivalence
## * - nand
ex = ex.strip()
last = ''
var = 0
# checks if there are: spaces between variables, invalid characters
for i in ex:
if i in self.characters:
if last == ' ' and var == 1:
raise ValueError("invalid variables sequence")
var = 1
elif i in self.operators.keys():
var = 0
elif i not in "()" + ' ':
raise ValueError("invalid character")
last = i
ex = "".join(ex.split())
# simple enum
NUMBER, LETTER, OPERATOR, L_BRACKET, R_BRACKET = range(0, 5)
# checks grammar, brackets and variables' names
flag = 0
prev = None
bracket_stack = []
for i in ex:
if i in self.characters:
if prev in [R_BRACKET]: raise ValueError("incorrect brackets")
if prev in [NUMBER] and flag == 0:
raise ValueError("variable starting with a number")
if i.isnumeric():
if prev in [None, OPERATOR, L_BRACKET, R_BRACKET]:
if int(i) not in [0, 1]:
raise ValueError("variable starting with a number")
if prev == LETTER:
flag = 1
prev = NUMBER
else:
flag = 0
prev = LETTER
elif i in self.operators.keys():
if prev in [None, OPERATOR, L_BRACKET] and i != '~':
raise ValueError("binary operator used as an unary")
if prev in [R_BRACKET, LETTER, NUMBER] and i == '~':
raise ValueError("unary operator used as a binary")
prev = OPERATOR
elif i == '(':
if prev in [LETTER, NUMBER, R_BRACKET]:
raise ValueError("incorrect brackets")
prev = L_BRACKET
bracket_stack.append(L_BRACKET)
elif i == ')':
if len(bracket_stack) == 0:
raise ValueError("incompatible brackets")
bracket_stack.pop()
if prev in [OPERATOR, L_BRACKET]:
raise ValueError("incorrect brackets")
prev = R_BRACKET
if prev == OPERATOR:
raise ValueError("operator shouldn't be at the end")
if len(bracket_stack) > 0:
raise ValueError("incompatible brackets")
return ex