Working on #48 : Renamed ExpressionParser.py into LogicalOperatorParser.py
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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():
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
+14
-13
@@ -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]
|
||||||
Reference in New Issue
Block a user