Working on #48 : Renamed ExpressionParser.py into LogicalOperatorParser.py

This commit is contained in:
2021-03-08 20:06:17 +01:00
parent 031bd0274e
commit a799ab2bbd
6 changed files with 24 additions and 22 deletions
@@ -12,7 +12,7 @@ from core.sheerka.services.sheerka_service import BaseService
from core.tokenizer import Tokenizer from core.tokenizer import Tokenizer
from core.utils import unstr_concept from core.utils import unstr_concept
from parsers.BaseNodeParser import ConceptNode from parsers.BaseNodeParser import ConceptNode
from parsers.ExpressionParser import ExpressionParser from parsers.LogicalOperatorParser import LogicalOperatorParser
from parsers.expressions import TrueifyVisitor from parsers.expressions import TrueifyVisitor
CONCEPT_EVALUATION_STEPS = [ CONCEPT_EVALUATION_STEPS = [
@@ -137,7 +137,7 @@ class SheerkaEvaluateConcept(BaseService):
if concept.get_metadata().where is None or concept.get_metadata().where.strip() == "": if concept.get_metadata().where is None or concept.get_metadata().where.strip() == "":
return None return None
ret = ExpressionParser().parse(context, ParserInput(concept.get_metadata().where)) ret = LogicalOperatorParser().parse(context, ParserInput(concept.get_metadata().where))
if not ret.status: if not ret.status:
# TODO: manage invalid where clause # TODO: manage invalid where clause
return None return None
+2 -2
View File
@@ -781,6 +781,6 @@ class SheerkaExecute(BaseService):
desc = desc or f"Parsing expression '{source}'" desc = desc or f"Parsing expression '{source}'"
with context.push(BuiltinConcepts.PARSE_CODE, source, desc) as sub_context: with context.push(BuiltinConcepts.PARSE_CODE, source, desc) as sub_context:
parser_input = context.sheerka.services[SheerkaExecute.NAME].get_parser_input(source) parser_input = context.sheerka.services[SheerkaExecute.NAME].get_parser_input(source)
from parsers.ExpressionParser import ExpressionParser from parsers.LogicalOperatorParser import LogicalOperatorParser
expr_parser = ExpressionParser() expr_parser = LogicalOperatorParser()
return expr_parser.parse(sub_context, parser_input) return expr_parser.parse(sub_context, parser_input)
@@ -18,8 +18,9 @@ from core.utils import index_tokens, COLORS, get_text_from_tokens
from evaluators.ConceptEvaluator import ConceptEvaluator from evaluators.ConceptEvaluator import ConceptEvaluator
from evaluators.PythonEvaluator import PythonEvaluator, Expando from evaluators.PythonEvaluator import PythonEvaluator, Expando
from parsers.BaseNodeParser import SourceCodeWithConceptNode, ConceptNode, SourceCodeNode 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.PythonParser import PythonNode
from parsers.expressions import AndNode
from sheerkarete.conditions import AndConditions from sheerkarete.conditions import AndConditions
CONCEPTS_ONLY_PARSERS = ["ExactConcept", "Bnf", "Sya", "Sequence"] CONCEPTS_ONLY_PARSERS = ["ExactConcept", "Bnf", "Sya", "Sequence"]
@@ -649,7 +650,7 @@ class SheerkaRuleManager(BaseService):
super().__init__(sheerka, order=12) super().__init__(sheerka, order=12)
self._format_rules = None # sorted by priority self._format_rules = None # sorted by priority
self._exec_rules = None # sorted by priority self._exec_rules = None # sorted by priority
self.expression_parser = ExpressionParser() self.expression_parser = LogicalOperatorParser()
def initialize(self): def initialize(self):
self.sheerka.bind_service_method(self.create_new_rule, True, visible=False) self.sheerka.bind_service_method(self.create_new_rule, True, visible=False)
@@ -60,7 +60,7 @@ class ReteConditionsEmitter:
return [AndConditions(conditions)] return [AndConditions(conditions)]
class ExpressionParser(BaseParser): class LogicalOperatorParser(BaseParser):
""" """
will parser logic expression will parser logic expression
like not (a and b or c) like not (a and b or c)
@@ -91,7 +91,7 @@ class ExpressionParser(BaseParser):
if not isinstance(parser_input, ParserInput): if not isinstance(parser_input, ParserInput):
return None 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 sheerka = context.sheerka
if parser_input.is_empty(): if parser_input.is_empty():
+1 -1
View File
@@ -4,7 +4,7 @@ from core.builtin_concepts_ids import BuiltinConcepts
from core.sheerka.services.SheerkaExecute import ParserInput from core.sheerka.services.SheerkaExecute import ParserInput
from core.tokenizer import TokenKind, Tokenizer from core.tokenizer import TokenKind, Tokenizer
from parsers.ComparisonParser import ComparisonParser from parsers.ComparisonParser import ComparisonParser
from parsers.ExpressionParser import ParenthesisMismatchError from parsers.expressions import ParenthesisMismatchError
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka 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 from tests.parsers.parsers_utils import get_expr_node_from_test_node, VAR, EXPR, EQ, NEQ, GT, GTE, LT, LTE, IN, NIN
@@ -8,20 +8,21 @@ from core.rule import Rule
from core.sheerka.services.SheerkaExecute import ParserInput from core.sheerka.services.SheerkaExecute import ParserInput
from core.tokenizer import TokenKind from core.tokenizer import TokenKind
from parsers.BaseParser import UnexpectedEofParsingError, UnexpectedTokenParsingError 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.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 sheerkarete.network import ReteNetwork
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
from tests.parsers.parsers_utils import compute_expected_array, resolve_test_concept, EXPR, OR, AND, NOT, \ 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 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): def init_parser(self):
sheerka, context = self.init_concepts() sheerka, context = self.init_concepts()
parser = ExpressionParser() parser = LogicalOperatorParser()
return sheerka, context, parser return sheerka, context, parser
@pytest.mark.parametrize("expression, expected", [ @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() 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 expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") 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): def test_i_can_get_compiled_expr_from_simple_python_expressions(self, expression):
sheerka, context, = self.init_test().unpack() sheerka, context, = self.init_test().unpack()
parser = ExpressionParser() parser = LogicalOperatorParser()
expr_node = parser.parse(context, ParserInput(expression)).body.body expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") 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): def test_i_can_compile_negative_conjunctions_when_pure_python(self, expression):
sheerka, context, *concepts = self.init_concepts("foo") sheerka, context, *concepts = self.init_concepts("foo")
parser = ExpressionParser() parser = LogicalOperatorParser()
expr_node = parser.parse(context, ParserInput(expression)).body.body expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") 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): 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() 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 expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") return_values, _ = parser.compile_conjunctions(context, [expr_node], "test")
@@ -321,7 +322,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka):
create_new=True create_new=True
).unpack() ).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" 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 expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test")
@@ -355,7 +356,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka):
).unpack() ).unpack()
expression = "a cat is a pet and bird is an animal and x > 5 and dog is a pet" 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 expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test")
@@ -381,7 +382,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka):
create_new=True create_new=True
).unpack() ).unpack()
parser = ExpressionParser() parser = LogicalOperatorParser()
expression = "a is a b" expression = "a is a b"
expr_node = parser.parse(context, ParserInput(expression)).body.body expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, [expr_node], "test") return_values, _ = parser.compile_conjunctions(context, [expr_node], "test")
@@ -407,7 +408,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka):
).unpack() ).unpack()
expression = "a cat is a pet and bird is an animal and x > 5 and dog is a pet" 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 expr_node = parser.parse(context, ParserInput(expression)).body.body
return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test") return_values, _ = parser.compile_conjunctions(context, expr_node.parts, "test")
@@ -466,7 +467,7 @@ class TestExpressionParser(TestUsingMemoryBasedSheerka):
sheerka, context, = self.init_test().unpack() sheerka, context, = self.init_test().unpack()
expected_full_condition = get_rete_conditions(*expected_conditions) expected_full_condition = get_rete_conditions(*expected_conditions)
parser = ExpressionParser() parser = LogicalOperatorParser()
expr_node = parser.parse(context, ParserInput(expression)).body.body expr_node = parser.parse(context, ParserInput(expression)).body.body
nodes = expr_node.parts if isinstance(expr_node, AndNode) else [expr_node] nodes = expr_node.parts if isinstance(expr_node, AndNode) else [expr_node]