Skip to content

Commit 58c40a9

Browse files
committed
add lab4 to infi=ormatics
1 parent 331d367 commit 58c40a9

26 files changed

+477
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from .Tree.Tree import TreeAPI
2+
3+
class AST():
4+
def __init__(self, to_json: bool = True) -> None:
5+
self.to_json = to_json
6+
7+
def main(self, file: str) -> dict:
8+
file = file.replace(">", ">\n").replace("\n\n", "\n")
9+
lines = file.split("\n")
10+
Tree = TreeAPI("root")
11+
tag_stack = [Tree]
12+
13+
for line in lines:
14+
TAG_FLAG = False
15+
OPEN_TAG, CLOSE_TAG = False, False
16+
tag_name_cache = ""
17+
buffer = ""
18+
19+
if line[:2] == "<?": continue
20+
21+
line = line.replace("\t", "") # удаляем лтшние табы
22+
23+
for idx, sym in enumerate(line):
24+
if TAG_FLAG:
25+
if line[idx-1] == "<": # перепроверяем начало тэга
26+
# флаги типа тэга: открывающий, закрывающий
27+
OPEN_TAG, CLOSE_TAG = sym != "/", sym == "/"
28+
# тут же добавим символ к имени открывающего тэга т.к. его захватило
29+
if OPEN_TAG: tag_name_cache += sym
30+
elif sym == ">" or sym == " ":
31+
TAG_FLAG = False # отключаем сбор информации о тэге
32+
if OPEN_TAG:
33+
tag_stack.append(
34+
tag_stack[-1].add_child(tag_name_cache)
35+
)
36+
elif CLOSE_TAG:
37+
if buffer != "": tag_stack[-1].add_child(buffer)
38+
if buffer == "" and len(tag_stack[-1].Tree.children) == 0: tag_stack[-1].add_child({})
39+
buffer = ""
40+
tag_stack = tag_stack[:-1]
41+
else: tag_name_cache += sym
42+
43+
elif sym == ">": # Inner args parser
44+
for arg in buffer.split():
45+
key, value = arg.split("=")
46+
tag_stack[-1].add_child(key).add_child(value)
47+
buffer = ""
48+
elif sym == "<": TAG_FLAG = True # детектируем начало тэга
49+
else: buffer += sym
50+
51+
if self.to_json: return Tree.read_tree()["root"]
52+
else: return Tree
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from .Tree.Tree import TreeAPI
2+
import re
3+
4+
'''
5+
УПРОЩЁННАЯ ВЕРСИЯ
6+
НЕ ПОДДЕРЖИИВАЮТСЯ ДАННЫЕ ВНУТРИ ТЭГА!!!
7+
'''
8+
9+
class AST():
10+
def __init__(self, to_json: bool = True) -> None:
11+
self.R_TYPE_1 = re.compile(
12+
r"(?i)((?<=<)[A-z]+)>((.|\n)*?)(</\1>)"
13+
)
14+
self.Tree = TreeAPI("root")
15+
self.to_json = to_json
16+
17+
def recursive_builder(self, data: str) -> object:
18+
19+
array = re.findall(self.R_TYPE_1, data)
20+
for item in array:
21+
TAG, DATA, _, END = map(str, item)
22+
self.tag_stack.append(
23+
self.tag_stack[-1].add_child(TAG)
24+
)
25+
self.recursive_builder(DATA)
26+
27+
if array == [] and data != "": self.tag_stack[-1].add_child(data)
28+
elif array == [] and data == "": self.tag_stack[-1].add_child({})
29+
30+
self.tag_stack = self.tag_stack[:-1]
31+
32+
def main(self, file: str) -> dict:
33+
self.tag_stack = [self.Tree]
34+
self.recursive_builder(file)
35+
36+
if self.to_json: return self.Tree.read_tree()["root"]
37+
else: return self.Tree
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Node:
2+
def __init__(self, name: str):
3+
self.children = []
4+
self.name = name
5+
6+
class TreeAPI:
7+
def __init__(self, base: str = "") -> None:
8+
self.Tree = Node(base)
9+
10+
def __repr__(self):
11+
return f"{self.Tree.name}: {self.Tree.children}"
12+
13+
def read_tree(self): # + some postprocessing
14+
children = self.Tree.children
15+
16+
if len(children) == 0: return self.Tree.name
17+
out = []
18+
for child in children: out.append(child.read_tree())
19+
20+
# postprocessing block (delete unused lists)
21+
if len(out) == 1: out = out[0]
22+
else:
23+
buffer = {}
24+
for elem in out:
25+
for k,v in elem.items():
26+
buffer.setdefault(k, [])
27+
buffer[k].append(v)
28+
29+
for elem in buffer:
30+
if len(buffer[elem]) == 1:
31+
buffer[elem] = buffer[elem][0]
32+
out = buffer
33+
34+
return {self.Tree.name: out}
35+
36+
def add_child(self, child_name: str) -> object:
37+
_ = TreeAPI(child_name)
38+
self.Tree.children.append(_)
39+
return _
Binary file not shown.
Binary file not shown.
Binary file not shown.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#from .task1 import Converter as task1
2+
from .task1 import Converter as С1
3+
from .task2 import Converter as С2
4+
from .task3 import Converter as C3
5+
from .protobuf_converter import Converter as C4
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)