Added first version of DebugManager. Implemented draft of the rule engine

This commit is contained in:
2020-11-20 13:41:45 +01:00
parent cd066881b4
commit 315f8ea09b
156 changed files with 8388 additions and 2852 deletions
+24 -3
View File
@@ -20,12 +20,23 @@ class PythonErrorNode(ErrorNode):
# self.log.debug("-> PythonErrorNode: " + str(self.exception))
@dataclass()
class ConceptDetected(ErrorNode):
name: str
class PythonNode(Node):
def __init__(self, source, ast_=None, concepts=None):
def __init__(self, source, ast_=None, objects=None):
self.source = source
self.ast_ = ast_ if ast_ else ast.parse(source, mode="eval") if source else None
self.concepts = concepts or {} # when concepts are recognized in the expression
self.objects = objects or {} # when objects (mainly concepts or rules) are recognized in the expression
self.compiled = None
def get_compiled(self):
if self.compiled is None:
self.compiled = compile(self.ast_, "<string>", "eval")
return self.compiled
# def __repr__(self):
# return "PythonNode(parser_input='" + self.parser_input + "', ast=" + self.get_dump(self.ast_) + ")"
@@ -80,12 +91,16 @@ class PythonParser(BaseParser):
self.source = kwargs.get("source", "<undef>")
def parse(self, context, parser_input: ParserInput):
if not isinstance(parser_input, ParserInput):
return None
sheerka = context.sheerka
tree = None
tracker = {} # to keep track of concept tokens (c:xxx:)
python_switcher = {
TokenKind.CONCEPT: lambda t: core.utils.encode_concept(t.value)
TokenKind.CONCEPT: lambda t: core.utils.encode_concept(t.value),
TokenKind.RULE: lambda t: core.utils.encode_concept(t.value, "R")
}
try:
@@ -106,6 +121,12 @@ class PythonParser(BaseParser):
except LexerError as e:
self.error_sink.append(e)
# Python parser will refuse input that directly refers to a concept
if isinstance(tree, ast.Expression) and isinstance(tree.body, ast.Name):
if tree.body.id in tracker or context.sheerka.fast_resolve(tree.body.id, return_new=False) is not None:
context.log("It's a simple concept. Not for me.", self.name)
self.error_sink.append(ConceptDetected(tree.body.id))
if self.has_error:
ret = sheerka.ret(
self.name,