diff --git a/src/core/sheerka/services/SheerkaEvaluateConcept.py b/src/core/sheerka/services/SheerkaEvaluateConcept.py index f1cfde5..5d3d385 100644 --- a/src/core/sheerka/services/SheerkaEvaluateConcept.py +++ b/src/core/sheerka/services/SheerkaEvaluateConcept.py @@ -12,7 +12,7 @@ from core.sheerka.services.sheerka_service import BaseService from core.tokenizer import Tokenizer from core.utils import unstr_concept from parsers.BaseNodeParser import ConceptNode -from parsers.ExpressionParser import ExpressionParser +from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.expressions import TrueifyVisitor CONCEPT_EVALUATION_STEPS = [ @@ -137,7 +137,7 @@ class SheerkaEvaluateConcept(BaseService): if concept.get_metadata().where is None or concept.get_metadata().where.strip() == "": return None - ret = ExpressionParser().parse(context, ParserInput(concept.get_metadata().where)) + ret = LogicalOperatorParser().parse(context, ParserInput(concept.get_metadata().where)) if not ret.status: # TODO: manage invalid where clause return None diff --git a/src/core/sheerka/services/SheerkaExecute.py b/src/core/sheerka/services/SheerkaExecute.py index 7b948ea..51061f0 100644 --- a/src/core/sheerka/services/SheerkaExecute.py +++ b/src/core/sheerka/services/SheerkaExecute.py @@ -781,6 +781,6 @@ class SheerkaExecute(BaseService): desc = desc or f"Parsing expression '{source}'" with context.push(BuiltinConcepts.PARSE_CODE, source, desc) as sub_context: parser_input = context.sheerka.services[SheerkaExecute.NAME].get_parser_input(source) - from parsers.ExpressionParser import ExpressionParser - expr_parser = ExpressionParser() + from parsers.LogicalOperatorParser import LogicalOperatorParser + expr_parser = LogicalOperatorParser() return expr_parser.parse(sub_context, parser_input) diff --git a/src/core/sheerka/services/SheerkaRuleManager.py b/src/core/sheerka/services/SheerkaRuleManager.py index 19abf8a..a0f58ed 100644 --- a/src/core/sheerka/services/SheerkaRuleManager.py +++ b/src/core/sheerka/services/SheerkaRuleManager.py @@ -18,8 +18,9 @@ from core.utils import index_tokens, COLORS, get_text_from_tokens from evaluators.ConceptEvaluator import ConceptEvaluator from evaluators.PythonEvaluator import PythonEvaluator, Expando from parsers.BaseNodeParser import SourceCodeWithConceptNode, ConceptNode, SourceCodeNode -from parsers.ExpressionParser import AndNode, ExpressionParser +from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.PythonParser import PythonNode +from parsers.expressions import AndNode from sheerkarete.conditions import AndConditions CONCEPTS_ONLY_PARSERS = ["ExactConcept", "Bnf", "Sya", "Sequence"] @@ -649,7 +650,7 @@ class SheerkaRuleManager(BaseService): super().__init__(sheerka, order=12) self._format_rules = None # sorted by priority self._exec_rules = None # sorted by priority - self.expression_parser = ExpressionParser() + self.expression_parser = LogicalOperatorParser() def initialize(self): self.sheerka.bind_service_method(self.create_new_rule, True, visible=False) diff --git a/src/parsers/ExpressionParser.py b/src/parsers/LogicalOperatorParser.py similarity index 99% rename from src/parsers/ExpressionParser.py rename to src/parsers/LogicalOperatorParser.py index 438bd80..d1d6e6e 100644 --- a/src/parsers/ExpressionParser.py +++ b/src/parsers/LogicalOperatorParser.py @@ -60,7 +60,7 @@ class ReteConditionsEmitter: return [AndConditions(conditions)] -class ExpressionParser(BaseParser): +class LogicalOperatorParser(BaseParser): """ will parser logic expression like not (a and b or c) @@ -91,7 +91,7 @@ class ExpressionParser(BaseParser): if not isinstance(parser_input, ParserInput): return None - context.log(f"Parsing '{parser_input}' with ExpressionParser", self.name) + context.log(f"Parsing '{parser_input}' with LogicalOperatorParser", self.name) sheerka = context.sheerka if parser_input.is_empty(): diff --git a/tests/parsers/test_ComparisonParser.py b/tests/parsers/test_ComparisonParser.py index 6648a35..d8bfcec 100644 --- a/tests/parsers/test_ComparisonParser.py +++ b/tests/parsers/test_ComparisonParser.py @@ -4,7 +4,7 @@ from core.builtin_concepts_ids import BuiltinConcepts from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import TokenKind, Tokenizer from parsers.ComparisonParser import ComparisonParser -from parsers.ExpressionParser import ParenthesisMismatchError +from parsers.expressions import ParenthesisMismatchError from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka from tests.parsers.parsers_utils import get_expr_node_from_test_node, VAR, EXPR, EQ, NEQ, GT, GTE, LT, LTE, IN, NIN diff --git a/tests/parsers/test_ExpressionParser.py b/tests/parsers/test_LogicalOperatorParser.py similarity index 97% rename from tests/parsers/test_ExpressionParser.py rename to tests/parsers/test_LogicalOperatorParser.py index 5fd0729..0800380 100644 --- a/tests/parsers/test_ExpressionParser.py +++ b/tests/parsers/test_LogicalOperatorParser.py @@ -8,20 +8,21 @@ from core.rule import Rule from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import TokenKind from parsers.BaseParser import UnexpectedEofParsingError, UnexpectedTokenParsingError -from parsers.ExpressionParser import ExpressionParser, LeftPartNotFoundError, ParenthesisMismatchError +from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.PythonParser import PythonNode -from parsers.expressions import TrueifyVisitor, IsAQuestionVisitor, AndNode +from parsers.expressions import TrueifyVisitor, IsAQuestionVisitor, AndNode, LeftPartNotFoundError, \ + ParenthesisMismatchError from sheerkarete.network import ReteNetwork from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka from tests.parsers.parsers_utils import compute_expected_array, resolve_test_concept, EXPR, OR, AND, NOT, \ get_expr_node_from_test_node, get_rete_conditions, CMV, CNC, CC, compare_with_test_object -class TestExpressionParser(TestUsingMemoryBasedSheerka): +class TestLogicalOperatorParser(TestUsingMemoryBasedSheerka): def init_parser(self): sheerka, context = self.init_concepts() - parser = ExpressionParser() + parser = LogicalOperatorParser() return sheerka, context, parser @pytest.mark.parametrize("expression, expected", [ @@ -228,7 +229,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): } sheerka, context, *concepts = self.init_test().with_concepts(*concepts_map.values(), create_new=True).unpack() - parser = ExpressionParser() + parser = LogicalOperatorParser() expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") @@ -257,7 +258,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): def test_i_can_get_compiled_expr_from_simple_python_expressions(self, expression): sheerka, context, = self.init_test().unpack() - parser = ExpressionParser() + parser = LogicalOperatorParser() expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") @@ -278,7 +279,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): def test_i_can_compile_negative_conjunctions_when_pure_python(self, expression): sheerka, context, *concepts = self.init_concepts("foo") - parser = ExpressionParser() + parser = LogicalOperatorParser() expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") @@ -297,7 +298,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): def test_i_can_get_compiled_expr_from_python_and_concept(self, expression, text_to_compile): sheerka, context, *concepts = self.init_test().with_concepts(Concept("foo bar"), create_new=True).unpack() - parser = ExpressionParser() + parser = LogicalOperatorParser() expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") @@ -321,7 +322,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): create_new=True ).unpack() - parser = ExpressionParser() + parser = LogicalOperatorParser() expression = "not a cat is a pet and not bird is an animal and not x > 5 and not dog is a pet" expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") @@ -355,7 +356,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): ).unpack() expression = "a cat is a pet and bird is an animal and x > 5 and dog is a pet" - parser = ExpressionParser() + parser = LogicalOperatorParser() expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") @@ -381,7 +382,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): create_new=True ).unpack() - parser = ExpressionParser() + parser = LogicalOperatorParser() expression = "a is a b" expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") @@ -407,7 +408,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): ).unpack() expression = "a cat is a pet and bird is an animal and x > 5 and dog is a pet" - parser = ExpressionParser() + parser = LogicalOperatorParser() expr_node = parser.parse(context, ParserInput(expression)).body.body return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") @@ -466,7 +467,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka): sheerka, context, = self.init_test().unpack() expected_full_condition = get_rete_conditions(*expected_conditions) - parser = ExpressionParser() + parser = LogicalOperatorParser() expr_node = parser.parse(context, ParserInput(expression)).body.body nodes = expr_node.parts if isinstance(expr_node, AndNode) else [expr_node]