-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
99 lines (85 loc) · 3.02 KB
/
main.py
File metadata and controls
99 lines (85 loc) · 3.02 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
import string
class SyntaxAnalyzer:
"""
МЛиТА-2023 ИДЗ№2
Группа 1305, студент Димитрий Перчаткин, вариант №12
Правильная скобочная запись арифметических выражений с одной операцией - операцией
умножения и двумя видами скобок. Причем знак умножения не пишется и обозначается
отсутствием знака. Выражение в скобках, если есть, то не может начинаться с квадратной
скобки. Могут быть “лишние” скобки, но одна буква не может браться в скобки.
Пример Правильная запись: [a((bcd))(((ac)d[ab](aaa)))]
Неправильная запись: [(ccc)a([ab]([cd](abc)(b)))]
Press ctrl+c to exit...
"""
def __init__(self, input_string):
self.__index = -1
self.__string = input_string
self.ch = ''
self.read()
def read(self):
if self.__index + 1 < len(self.__string):
self.__index += 1
self.ch = self.__string[self.__index]
else:
self.ch = "success"
def language(self):
if self.ch in string.ascii_lowercase + "([":
self.content()
def content(self):
if self.ch in string.ascii_lowercase:
self.letter()
self.language()
elif self.ch == '(':
self.read()
self.expression()
if self.ch == ')':
self.read()
else:
raise ValueError
self.language()
elif self.ch == '[':
self.read()
self.expression()
if self.ch == ']':
self.read()
else:
raise ValueError
self.language()
else:
raise ValueError
def expression(self):
if self.ch in string.ascii_letters:
self.letter()
self.content()
self.language()
elif self.ch == '(':
self.read()
self.expression()
if self.ch == ')':
self.read()
else:
raise ValueError
self.language()
else:
raise ValueError
def letter(self):
if self.ch in string.ascii_letters:
self.read()
else:
raise ValueError
def main(self):
try:
self.language()
except ValueError:
print(f"Result: ERROR")
else:
if self.ch == "success":
print(f"Result: OK")
if __name__ == "__main__":
print(SyntaxAnalyzer.__doc__)
while True:
try:
syntax_analyzer = SyntaxAnalyzer(input("Insert string: "))
syntax_analyzer.main()
except KeyboardInterrupt:
break