Added first version of DebugManager. Implemented draft of the rule engine
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user