-
Notifications
You must be signed in to change notification settings - Fork 0
/
parsing.py
executable file
·88 lines (81 loc) · 2.3 KB
/
parsing.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
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
import string
from error import error
letters = string.ascii_uppercase
def canHave(rule, i, first, last, chars, line, where):
if (first == False and i == 0):
error('Error rule ' + line)
if (last == False and i == len(rule) - 1):
error('Error rule ' + line)
if (i == 0 and where == -1):
return
if (i == len(rule) - 1 and where == 1):
return
if (rule[i + where] in chars):
return
else:
error('Error rule ' + line)
def checkParenthesis(rule, line):
x = 0
for key in rule:
if (key == '('):
x += 1
elif (key == ')' and x > 0):
x -= 1
elif (key == ')'):
error('Error rule ' + line)
if (x != 0):
error('Error rule ' + line)
def removeSpaces(rule):
valid = []
for x in rule:
x = x.strip()
if (len(x) > 0):
valid.append(x)
return valid
def checkEqual(rule, line):
x = 0
for key in rule:
if (key == '='):
x += 1
if (x != 1):
error('Error rule ' + line)
def parsing(rules):
line = 0
valid = []
while (line < len(rules)):
rule = rules[line]
rule = removeSpaces(rule)
checkParenthesis(rule, str(line + 1))
checkEqual(rule, str(line + 1))
i = 0
for x in rule:
if (x.isupper()):
canHave(rule, i, 1, 1, '(!+|^>', str(line + 1), -1)
canHave(rule, i, 1, 1, ')+|^<=', str(line + 1), 1)
elif (x == '('):
canHave(rule, i, 1, 0, '(!+|^>', str(line + 1), -1)
canHave(rule, i, 1, 0, '(!' + letters, str(line + 1), 1)
elif (x == ')'):
canHave(rule, i, 0, 1, ')' + letters, str(line + 1), -1)
canHave(rule, i, 0, 1, ')+|^<=', str(line + 1), 1)
elif (x == '!'):
canHave(rule, i, 1, 0, '+|^(>' + letters, str(line + 1), -1)
canHave(rule, i, 1, 0, '(' + letters, str(line + 1), 1)
elif (x == '+' or x == '|' or x == '^'):
canHave(rule, i, 0, 0, ')' + letters, str(line + 1), -1)
canHave(rule, i, 0, 0, '(!' + letters, str(line + 1), 1)
elif (x == '='):
canHave(rule, i, 0, 0, ')<' + letters, str(line + 1), -1)
canHave(rule, i, 0, 0, '>', str(line + 1), 1)
elif (x == '>'):
canHave(rule, i, 0, 0, '=', str(line + 1), -1)
canHave(rule, i, 0, 0, '!(' + letters, str(line + 1), 1)
elif (x == '<'):
canHave(rule, i, 0, 0, ')' + letters, str(line + 1), -1)
canHave(rule, i, 0, 0, '=', str(line + 1), 1)
else:
error('Unexpected ' + x + ' rule ' + str(line + 1))
i += 1
valid.append(rule)
line += 1
return valid