-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvalid.py
More file actions
148 lines (125 loc) · 3.9 KB
/
valid.py
File metadata and controls
148 lines (125 loc) · 3.9 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import re
def check_brackets(rule):
open_count = 0
closed_count = 0
for e in rule:
if e == '(':
open_count += 1
elif e == ')':
closed_count += 1
if closed_count > open_count:
print("invalid use of brackets in line: ", rule)
return False
if open_count == closed_count:
return True
print("invalid use of brackets in line: ", rule)
return False
def is_valid_rule(line):
pattern = r'[^A-Z" "/+/|/^/!/=/</>/(/)]'
if re.search(pattern, line):
print("Invalid characters in line: ", line)
return False
tmp = ''
if "=>" in line:
tmp = line.split("=>")
elif "<=>" in line:
tmp = line.split("<=>")
if len(tmp) != 2:
print("Invalid syntax in line ", line)
return False
for e in tmp:
if '(' or ')' in e:
if not check_brackets(e):
return False
spl = line.split(' ')
operators = ['+', '|', '^', "=>", "<=>"]
op_found = False
fact_found = False
for e in spl:
e = e.replace('(', '')
e = e.replace(')', '')
if e in operators and op_found:
print("Syntax error in line ", line, " double operator found ", e)
return False
elif e in operators and not op_found:
op_found = True
fact_found = False
if e not in operators and fact_found:
print("Syntax error in line ", line, " double fact found ", e)
return False
elif e not in operators and not fact_found:
fact_found = True
op_found = False
length = len(e)
if length == 2:
if e == "=>" or (e[0] == '!' and e[1].isupper()) or \
(e[0] == '(' and e[1].isupper()) or (e[1] == ')' and e[0].isupper()):
pass
else:
print("Syntax error in line ", line, " found unexpected characters ", e)
return False
if length > 2:
if e != "<=>":
print("Syntax error in line ", line, " found unexpected characters ", e)
return False
return True
def is_valid_query(line):
pattern = r'[^A-Z/?]'
if re.search(pattern, line):
print("Invalid characters in line: ", line)
return False
return True
def is_valid_facts(line):
pattern = r'[^A-Z/=]'
if re.search(pattern, line):
print("Invalid characters in line: ", line)
return False
return True
def valid_syntax(fd):
errors = 0
facts = False
queries = False
rules = False
for line in fd:
line = line.split("#")[0].strip()
if not line:
pass
elif "=>" in line or "<=>" in line:
if "<=>" in line:
print("Program does not yet support if and only if rules", line)
errors += 1
rules = True
if not is_valid_rule(line):
errors += 1
elif line[0] == '=':
if is_valid_facts(line):
if not facts:
facts = True
else:
print("Invalid line: ", line, " Facts already found")
errors += 1
else:
errors += 1
elif line[0] == '?':
if is_valid_query(line):
if not queries:
queries = True
else:
print("Invalid line: ", line, " Queries all ready found")
errors += 1
else:
errors += 1
else:
print('invalid line: ', line)
errors += 1
fd.seek(0)
if not facts:
print('No facts in file')
return False
if not queries:
print('No queries in file')
return False
if not rules:
print('No rules in file')
if not errors:
return True