Commit cc256df3 authored by Sergey Bobrov's avatar Sergey Bobrov

Описал def parser

parent d01ebe56
......@@ -114,6 +114,7 @@ class Graph:
return False
# cur_state, implicit_parallelization_info = morph(data)
cur_state = transfer_f(data)
print(cur_state)
# print(morph)
if '__EXCEPTION__' in data:
return False
......
......@@ -273,28 +273,45 @@ class Parser():
# @todo В случае, если на вход будет подан файл в отличной от UTF-8 кодировке программа работать не будет
with open(filename, "r", encoding="utf-8") as file:
dot = file.read()
# проверка на правильное количесво скобок
self._check_brackets(dot)
# @todo Возможно стоит заменить данный код на библиотеку Lark
# поиск всех подстрок в кавычках
comments = [m for m in re.finditer(r'\".*\"', dot)]
for m in comments:
# Заменяет пробелы внутри кавычек на специальный символ \0
dot=dot[:m.span()[0]]+(dot[m.span()[0]:m.span()[1]]).replace(' ','\0')+dot[m.span()[1]:]
# Удаляет все пробелы, табы(\t) и возвраты каретки(\r), кроме тех, что внутри кавычек(они заменены на \0)
dot = re.sub(r"[ \t\r]", "", dot) #deleting all spaces
# Удаляет ключевые слова digraph, а также фигурные скобки { и }
dot = re.sub(r"((digraph)|}|{)", "", dot)
# Удаляет однострочные комментарии, начинающиеся с //
dot = re.sub(r"\/\/.*", "", dot)
# Удаляет строки, содержащие только перенос строки (\n)
dot = re.sub(r"^\n$", "", dot)
# @ todo заменить нижние две строки на dotlines = [line.strip() for line in dot.splitlines() if line.strip()]
# разбивает строку на список подстрок
dotlines = dot.splitlines()
# фильтрует пустые подстроки
dotlines = list(filter(None, dotlines))
# записали имя графа в класс GraphFactory
self.fact.name = dotlines[0]
# Удалили из строки
dotlines = dotlines[1:]
# ent_re - regular expr for edges, states, functions properties
# ищет строки вида ИМЯ[атрибуты]
ent_re = re.compile(r"^\w+\[.*\]$")
# top_re - regular expr for topology properties, most time consuming one
# Строки вида ИСТОЧНИК->ЦЕЛЬ[атрибуты] или ИСТОЧНИК=>ЦЕЛЬ[атрибуты]
top_re = re.compile(r"^(\w+,?)+(->|=>)(\w+,?)+(\[(\w+=(\(?\w+,?\)?)+,?)+\])?")
# (r"^\w[\w\s,]*(->|=>)\s*\w[\w\s,=\[\]()]*$")
for i, ln in enumerate(dotlines):
# функция
if ent_re.match(ln):
name, parm = self._param_from_entln(ln)
self.fact.entities[name] = parm
# топология
elif top_re.match(ln):
self._topology(ln)
return self.fact.build(Parser.subgr_count)
......
......@@ -5,7 +5,6 @@ digraph CYCLIC {
MORPH_LOOP [predicate=CHECK, function=INC]
MORPH_EXIT [function=INC]
// Топология с циклом
__BEGIN__ -> LOOP [edge_index=0]
LOOP -> LOOP [morphism=MORPH_LOOP, edge_index=1]
......
......@@ -45,7 +45,7 @@ class ParserGoodCheck(unittest.TestCase):
def test_complex_graph(self):
parsr = Parser()
gr = parsr.parse_file("./tests/adot/complex.adot")
gr = parsr.parse_file("./adot/complex.adot")
data = {"a": 1, "b": 1}
gr.run(data)
self.assertEqual(data["a"], 4)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment