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