diff --git a/comsdk/parser.py b/comsdk/parser.py index 8f8e2c2c1459f1531afd645c7af1764c71e5a1a7..00b323bf2013b244835a56751a6900fbf7848212 100644 --- a/comsdk/parser.py +++ b/comsdk/parser.py @@ -289,32 +289,32 @@ class Parser(): def parse_file(self, filename): # @todo В случае, если на вход будет подан файл в отличной от UTF-8 кодировке программа работать не будет gcd_dir_rel_path = os.path.abspath('../../gcd/') - file = open(gcd_dir_rel_path + '/' + filename, encoding='utf-8') # "r") - dot = file.read() - self._check_brackets(dot) - - comments = [m for m in re.finditer(r'\".*\"', dot)] - for m in comments: - dot = dot[:m.span()[0]] + (dot[m.span()[0]:m.span()[1]]).replace(' ', '\0') + dot[m.span()[1]:] - dot = re.sub(r"[ \t\r]", "", dot) # deleting all spaces - dot = re.sub(r"((digraph)|}|{)", "", dot) - dot = re.sub(r"\/\/.*", "", dot) - dot = re.sub(r"^\n$", "", dot) - dotlines = dot.splitlines() - dotlines = list(filter(None, dotlines)) - 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) + with open(gcd_dir_rel_path + '/' + filename, encoding='utf-8') as file: + dot = file.read() + self._check_brackets(dot) + + comments = [m for m in re.finditer(r'\".*\"', dot)] + for m in comments: + dot = dot[:m.span()[0]] + (dot[m.span()[0]:m.span()[1]]).replace(' ', '\0') + dot[m.span()[1]:] + dot = re.sub(r"[ \t\r]", "", dot) # deleting all spaces + dot = re.sub(r"((digraph)|}|{)", "", dot) + dot = re.sub(r"\/\/.*", "", dot) + dot = re.sub(r"^\n$", "", dot) + dotlines = dot.splitlines() + dotlines = list(filter(None, dotlines)) + 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) checked = [] @@ -342,8 +342,9 @@ class Parser(): else: f = open(self.fact.name + ".cpp", "w") print(Template(filename=os.path.abspath("../pycomsdk/cpp/template.cpp")).render(preds=preds, morphs=morphs, - sels=sels, states=st, - body=body), file=f) + sels=sels, states=st, + body=body), file=f) + f.close() return f