Added DefaultParser
This commit is contained in:
+49
-9
@@ -1,8 +1,9 @@
|
||||
import os
|
||||
from dataclasses import dataclass
|
||||
|
||||
from core.concept import Concept
|
||||
from sdp.sheerkaDataProvider import SheerkaDataProvider
|
||||
from core.concept import Concept, ErrorConcept
|
||||
from parsers.PythonParser import PythonParser
|
||||
from sdp.sheerkaDataProvider import SheerkaDataProvider, Event
|
||||
from parsers.DefaultParser import DefaultParser, DefConceptNode
|
||||
|
||||
|
||||
class Singleton(type):
|
||||
@@ -54,6 +55,7 @@ class Sheerka(Concept, metaclass=Singleton):
|
||||
self.create_builtin_concepts()
|
||||
|
||||
self.sdp = None
|
||||
self.parsers = []
|
||||
|
||||
def create_builtin_concepts(self):
|
||||
"""
|
||||
@@ -76,11 +78,38 @@ class Sheerka(Concept, metaclass=Singleton):
|
||||
|
||||
try:
|
||||
self.sdp = SheerkaDataProvider(root_folder)
|
||||
self.parsers.append(lambda text: DefaultParser(text, PythonParser))
|
||||
except IOError as e:
|
||||
return ReturnValue(False, self.get_concept(Sheerka.ERROR_CONCEPT_NAME, True), e)
|
||||
|
||||
return ReturnValue(True, self.get_concept(Sheerka.SUCCESS_CONCEPT_NAME, True))
|
||||
|
||||
def eval(self, text):
|
||||
#evt_digest = self.sdp.save_event(Event(text))
|
||||
result = self.try_parse(text)
|
||||
|
||||
return_values = []
|
||||
for parser_name, status, node in result:
|
||||
if not status:
|
||||
return_values.append(ReturnValue(False, ErrorConcept(body=node)))
|
||||
elif status and isinstance(node, DefConceptNode):
|
||||
return_values.append(self.add_concept(node))
|
||||
|
||||
return return_values
|
||||
|
||||
def try_parse(self, text):
|
||||
result = []
|
||||
for parser in self.parsers:
|
||||
p = parser(text)
|
||||
# try:
|
||||
# tree = p.parse()
|
||||
# result.append((p.name, tree))
|
||||
# except Exception as e:
|
||||
# result.append((p.name, e))
|
||||
tree = p.parse()
|
||||
result.append((p.name, not p.has_error, p.error_sink if p.has_error else tree))
|
||||
return result
|
||||
|
||||
def get_concept(self, name, is_builtin=False):
|
||||
"""
|
||||
Given a concept name, tries to find it
|
||||
@@ -93,6 +122,22 @@ class Sheerka(Concept, metaclass=Singleton):
|
||||
return concept
|
||||
return self.concepts[1]
|
||||
|
||||
def add_concept(self, def_concept_node: DefConceptNode):
|
||||
"""
|
||||
Adds a new concept to the system
|
||||
:param def_concept_node: DefConceptNode
|
||||
:return: digest of the new concept
|
||||
"""
|
||||
|
||||
concept = Concept(def_concept_node.name)
|
||||
for prop in ("where", "pre", "post", "body"):
|
||||
concept_part_node = getattr(def_concept_node, prop)
|
||||
value = concept_part_node.source if hasattr(concept_part_node, "source") else ""
|
||||
setattr(concept, prop, value)
|
||||
|
||||
concept.add_codes(def_concept_node.get_codes())
|
||||
return ReturnValue(True, concept)
|
||||
|
||||
@staticmethod
|
||||
def concept_equals(concept1, concept2):
|
||||
"""True if the two concepts refer to the same concept"""
|
||||
@@ -102,9 +147,4 @@ class Sheerka(Concept, metaclass=Singleton):
|
||||
if concept1 is None or concept2 is None:
|
||||
return False
|
||||
|
||||
return concept1.id == concept2.id
|
||||
|
||||
def record_event(self, event):
|
||||
self.sdp.save_event(event)
|
||||
|
||||
|
||||
return concept1.key == concept2.key
|
||||
|
||||
Reference in New Issue
Block a user