Commit bb7c1772 authored by Sergey Bobrov's avatar Sergey Bobrov

Добавил обработку коментариев для атрибутов класса. Изменил функцию…

Добавил обработку коментариев для атрибутов класса. Изменил функцию _param_from_props класса Parser() для корректной обработки коментариев.
parent c7b98e1d
...@@ -7,7 +7,6 @@ from comsdk.edge import Edge ...@@ -7,7 +7,6 @@ from comsdk.edge import Edge
class Params(): class Params():
__slots__ = ( __slots__ = (
'module', 'entry_func', 'predicate', 'selector', 'function', 'module', 'entry_func', 'predicate', 'selector', 'function',
'morphism', 'parallelism', 'comment', 'order', 'subgraph', 'morphism', 'parallelism', 'comment', 'order', 'subgraph',
...@@ -18,11 +17,16 @@ class Params(): ...@@ -18,11 +17,16 @@ class Params():
def __init__(self): def __init__(self):
for slot in self.__slots__: for slot in self.__slots__:
setattr(self, slot, None) setattr(self, slot, None)
self.comment = "" # Инициализируем как пустую строку вместо None
def __str__(self): def __str__(self):
stri = "" stri = ""
for s in self.__slots__: for s in self.__slots__:
stri += ((s+": {}, ".format(getattr(self, s))) if getattr(self, s) is not None else "") attr = getattr(self, s)
if attr is not None and s != 'comment': # Комментарии выводим отдельно
stri += f"{s}: {attr}, "
if self.comment:
stri += f"comment: '{self.comment}'"
return stri return stri
# entities = {} # entities = {}
...@@ -187,34 +191,73 @@ class Parser(): ...@@ -187,34 +191,73 @@ class Parser():
setattr(res[i], sl, vals[sl][i]) setattr(res[i], sl, vals[sl][i])
return res return res
#Props is line "[proFp=smth, ...]" def _param_from_props(self, props):
def _param_from_props(self,props):
parm = Params() parm = Params()
comment = "" comment = ""
if props =="": if props == "":
return parm return parm
props = props.replace("]", '') props = props.replace("]", '')
# Извлекаем комментарий, но не удаляем его полностью
if '\"' in props: if '\"' in props:
m = [m for m in re.finditer(r'\".*\"', props)][0] matches = [m for m in re.finditer(r'\"(.*?)\"', props)]
comment = props[m.span()[0]+1:m.span()[1]-1] if matches:
props=props[:m.span()[0]]+props[m.span()[1]:] comment = matches[0].group(1).replace("\0", " ")
# Заменяем комментарий на специальный маркер, чтобы не мешал дальнейшему парсингу
props = props[:matches[0].start()] + "COMMENT_PLACEHOLDER" + props[matches[0].end():]
if '(' in props: if '(' in props:
mchs = [m for m in re.finditer(r'\((\w+,)*\w+\)', props)] mchs = [m for m in re.finditer(r'\((\w+,)*\w+\)', props)]
for m in mchs: for m in mchs:
props=props[:m.span()[0]]+(props[m.span()[0]:m.span()[1]]).replace(',','\0')+props[m.span()[1]:] props = props[:m.span()[0]] + (props[m.span()[0]:m.span()[1]]).replace(',', '\0') + props[m.span()[1]:]
props = props.replace("(","")
props = props.replace(")","") props = props.replace("(", "")
rs =props.split(r",") #.split(r", ") props = props.replace(")", "")
# Восстанавливаем комментарий после обработки скобок
props = props.replace("COMMENT_PLACEHOLDER", "")
rs = props.split(r",")
for r in rs: for r in rs:
r=r.split(r"=", 1) r = r.split(r"=", 1)
if r[0] in parm.__slots__: if r[0] in parm.__slots__:
setattr(parm, r[0], r[1]) setattr(parm, r[0], r[1])
else: else:
raise Exception("\tERROR:Unknown parameter: "+ r[0]) raise Exception("\tERROR:Unknown parameter: " + r[0])
if comment != "": if comment != "":
setattr(parm, "comment", comment.replace("\0", " ")) setattr(parm, "comment", comment)
return parm return parm
#Props is line "[proFp=smth, ...]"
#def _param_from_props(self,props):
# parm = Params()
#comment = ""
#if props =="":
# return parm
#props = props.replace("]", '')
#if '\"' in props:
# удаляеться комментарий
# m = [m for m in re.finditer(r'\".*\"', props)][0]
# comment = props[m.span()[0]+1:m.span()[1]-1]
# props=props[:m.span()[0]]+props[m.span()[1]:]
#if '(' in props:
# mchs = [m for m in re.finditer(r'\((\w+,)*\w+\)', props)]
# for m in mchs:
# props=props[:m.span()[0]]+(props[m.span()[0]:m.span()[1]]).replace(',','\0')+props[m.span()[1]:]
#props = props.replace("(","")
#props = props.replace(")","")
#rs =props.split(r",") #.split(r", ")
#for r in rs:
# r=r.split(r"=", 1)
# if r[0] in parm.__slots__:
# setattr(parm, r[0], r[1])
# else:
# raise Exception("\tERROR:Unknown parameter: "+ r[0])
#if comment != "":
# setattr(parm, "comment", comment.replace("\0", " "))
#return parm
def _param_from_entln(self, raw): def _param_from_entln(self, raw):
res = re.split(r"\[", raw, 1) res = re.split(r"\[", raw, 1)
return res[0], self._param_from_props(res[1]) return res[0], self._param_from_props(res[1])
...@@ -302,6 +345,7 @@ class Parser(): ...@@ -302,6 +345,7 @@ class Parser():
dotlines = dotlines[1:] dotlines = dotlines[1:]
# ent_re - regular expr for edges, states, functions properties # ent_re - regular expr for edges, states, functions properties
# ищет строки вида ИМЯ[атрибуты] # ищет строки вида ИМЯ[атрибуты]
print(dotlines)
ent_re = re.compile(r"^\w+\[.*\]$") ent_re = re.compile(r"^\w+\[.*\]$")
# top_re - regular expr for topology properties, most time consuming one # top_re - regular expr for topology properties, most time consuming one
# Строки вида ИСТОЧНИК->ЦЕЛЬ[атрибуты] или ИСТОЧНИК=>ЦЕЛЬ[атрибуты] # Строки вида ИСТОЧНИК->ЦЕЛЬ[атрибуты] или ИСТОЧНИК=>ЦЕЛЬ[атрибуты]
...@@ -311,6 +355,7 @@ class Parser(): ...@@ -311,6 +355,7 @@ class Parser():
# функция # функция
if ent_re.match(ln): if ent_re.match(ln):
name, parm = self._param_from_entln(ln) name, parm = self._param_from_entln(ln)
print(f'{parm}')
self.fact.entities[name] = parm self.fact.entities[name] = parm
# топология # топология
elif top_re.match(ln): elif top_re.match(ln):
......
digraph SIMPLEST { digraph SIMPLEST {
FUNCA [module=test_funcs.simplest, entry_func=increment_a_edge] FUNCA [module=test_funcs.simplest, entry_func=increment_a_edge, comment="name FUNC_A"]
FUNCB [module=test_funcs.simplest, entry_func=increment_b_edge] FUNCB [module=test_funcs.simplest, entry_func=increment_b_edge, comment="name FUNC_B"]
PRED [module=test_funcs.simplest, entry_func=true_predicate] PRED [module=test_funcs.simplest, entry_func=true_predicate, comment="name PRED"]
INCR_A [predicate=PRED, function=FUNCA] INCR_A [predicate=PRED, function=FUNCA, comment="name INCR_A"]
INCR_B [predicate=PRED, function=FUNCB] INCR_B [predicate=PRED, function=FUNCB, comment="name INCR_B"]
__BEGIN__ -> ROOT __BEGIN__ -> ROOT
ROOT -> BR1, BR2 [morphism=(INCR_A, INCR_B)] ROOT -> BR1, BR2 [morphism=(INCR_A, INCR_B)]
......
...@@ -4,9 +4,9 @@ digraph SIMPLEST { ...@@ -4,9 +4,9 @@ digraph SIMPLEST {
INCR_A [predicate=PRED, function=FUNCA] INCR_A [predicate=PRED, function=FUNCA]
ST1 [subgraph=tests/adot/trivial.adot] ST1 [subgraph=./adot/trivial.adot]
ST2 [subgraph=tests/adot/cycled.adot] ST2 [subgraph=./adot/cycled.adot]
ST3 [subgraph=tests/adot/branching.adot] ST3 [subgraph=./adot/branching.adot]
__BEGIN__ -> ST1 __BEGIN__ -> ST1
ST1 -> ST2 [morphism=INCR_A] ST1 -> ST2 [morphism=INCR_A]
......
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