Sfoglia il codice sorgente

Put lark cache file in OS temp dir

Joeri Exelmans 4 anni fa
parent
commit
d616e6553a

+ 9 - 6
src/sccd/action_lang/parser/text.py

@@ -129,16 +129,19 @@ class Transformer(lark.Transformer):
   def func_decl(self, node):
     return FunctionDeclaration(params_decl=node[0], body=node[1])
 
-import os
+import os, tempfile, pathlib
 grammar_dir = os.path.dirname(__file__)
-with open(os.path.join(grammar_dir,"action_lang.g")) as file:
+grammar_path = os.path.join(grammar_dir,"action_lang.g")
+with open(grammar_path) as file:
   grammar = file.read()
-
-_default_parser = lark.Lark(grammar, parser="lalr", start=["expr", "stmt"], transformer=Transformer(), cache=True)
+cache_file = tempfile.gettempdir()+'/lark_cache_'+str(pathlib.Path(grammar_path).stat().st_mtime_ns)
 
 class TextParser:
-  def __init__(self, parser=_default_parser):
-    self.parser = parser
+  def __init__(self, parser=None):
+    if parser is None:
+      self.parser = lark.Lark(grammar, parser="lalr", start=["expr", "stmt"], transformer=Transformer(), cache=cache_file)
+    else:
+      self.parser = parser
 
   def parse_expr(self, text: str) -> Expression:
     return self.parser.parse(text, start="expr")

+ 6 - 3
src/sccd/statechart/parser/text.py

@@ -75,18 +75,21 @@ class Transformer(action_lang.Transformer):
     event_id = self.globals.events.assign_id(event_name)
     return EventDecl(id=event_id, name=event_name, params_decl=node[1])
 
-import os
+import os, pathlib
 grammar_dir = os.path.dirname(__file__)
-with open(os.path.join(grammar_dir, "statechart.g")) as file:
+grammar_path = os.path.join(grammar_dir,"statechart.g")
+with open(grammar_path) as file:
   # Concatenate Action Lang and SC grammars
   grammar = action_lang.grammar + file.read()
+cache_file = action_lang.cache_file+'_'+str(pathlib.Path(grammar_path).stat().st_mtime_ns)
+
 
 # Parses action language expressions and statements, and also event decls, state refs and semantic choices. 
 class TextParser(action_lang.TextParser):
   def __init__(self, globals):
     # Building the parser is actually the slowest step of parsing a statechart model.
     # Doesn't have to happen every time, so should find a way to speed this up.
-    parser = lark.Lark(grammar, parser="lalr", start=["expr", "block", "event_decl_list", "path", "semantic_choice"], transformer=Transformer(globals), cache=True)
+    parser = lark.Lark(grammar, parser="lalr", start=["expr", "block", "event_decl_list", "path", "semantic_choice"], transformer=Transformer(globals), cache=cache_file)
     super().__init__(parser)
 
   def parse_semantic_choice(self, text: str):