Working on #50 : Adding unit tests
This commit is contained in:
@@ -17,11 +17,12 @@ from core.tokenizer import Keywords, TokenKind, Token, IterParser
|
||||
from core.utils import index_tokens, COLORS, get_text_from_tokens
|
||||
from evaluators.ConceptEvaluator import ConceptEvaluator
|
||||
from evaluators.PythonEvaluator import PythonEvaluator, Expando
|
||||
from parsers.BaseExpressionParser import AndNode, ExpressionVisitor, VariableNode, ComparisonNode
|
||||
from parsers.BaseNodeParser import SourceCodeWithConceptNode, ConceptNode, SourceCodeNode
|
||||
from parsers.LogicalOperatorParser import LogicalOperatorParser
|
||||
from parsers.PythonParser import PythonNode
|
||||
from parsers.BaseExpressionParser import AndNode
|
||||
from sheerkarete.conditions import AndConditions
|
||||
from sheerkarete.common import V
|
||||
from sheerkarete.conditions import AndConditions, Condition
|
||||
|
||||
CONCEPTS_ONLY_PARSERS = ["ExactConcept", "Bnf", "Sya", "Sequence"]
|
||||
|
||||
@@ -1118,3 +1119,51 @@ class SheerkaRuleManager(BaseService):
|
||||
return return_value.body.body.concept
|
||||
|
||||
return None
|
||||
|
||||
|
||||
class ReteConditionExprVisitor(ExpressionVisitor):
|
||||
|
||||
def __init__(self, context):
|
||||
self.context = context
|
||||
self.var_counter = 0
|
||||
self.variables = {}
|
||||
self.res = []
|
||||
|
||||
def add_variable(self, target):
|
||||
var_name = f"__x_{self.var_counter:02}__"
|
||||
self.var_counter += 1
|
||||
self.variables[target] = var_name
|
||||
return var_name
|
||||
|
||||
def init_variable_if_needed(self, node):
|
||||
if node.name not in self.variables:
|
||||
var_name = self.add_variable(node.name)
|
||||
self.res.append(Condition(V(var_name), "__name__", node.name))
|
||||
|
||||
return V(self.variables[node.name])
|
||||
|
||||
def get_conditions(self, expr_node):
|
||||
self.res.clear()
|
||||
self.var_counter = 0
|
||||
self.variables.clear()
|
||||
|
||||
self.visit(expr_node)
|
||||
return AndConditions(self.res)
|
||||
|
||||
def visit_VariableNode(self, expr_node):
|
||||
var_name = self.init_variable_if_needed(expr_node)
|
||||
if expr_node.attributes_str is not None:
|
||||
self.res.append(Condition(var_name, expr_node.attributes_str, True))
|
||||
|
||||
def visit_AndNode(self, expr_node: AndNode):
|
||||
for node in expr_node.parts:
|
||||
self.visit(node)
|
||||
|
||||
def visit_ComparisonNode(self, expr_node: ComparisonNode):
|
||||
if isinstance(expr_node.left, VariableNode):
|
||||
left = self.init_variable_if_needed(expr_node.left)
|
||||
attr = expr_node.left.attributes_str or "__self__"
|
||||
right = eval(get_text_from_tokens(expr_node.right.tokens))
|
||||
self.res.append(Condition(left, attr, right))
|
||||
else:
|
||||
raise FailedToCompileError(expr_node)
|
||||
|
||||
Reference in New Issue
Block a user