diff --git a/src/core/builtin_helpers.py b/src/core/builtin_helpers.py index 0a24050..eb39254 100644 --- a/src/core/builtin_helpers.py +++ b/src/core/builtin_helpers.py @@ -790,7 +790,7 @@ def is_a_question(context, concept): return False node = res.body.body - from parsers.expressions import IsAQuestionVisitor + from parsers.BaseExpressionParser import IsAQuestionVisitor return IsAQuestionVisitor().is_a_question(node) diff --git a/src/core/sheerka/Sheerka.py b/src/core/sheerka/Sheerka.py index 7a33f6d..1c6d047 100644 --- a/src/core/sheerka/Sheerka.py +++ b/src/core/sheerka/Sheerka.py @@ -278,7 +278,9 @@ class Sheerka(Concept): """ core.utils.import_module_and_sub_module("parsers") base_class = core.utils.get_class("parsers.BaseParser.BaseParser") - modules_to_skip = ["parsers.BaseNodeParser", "parsers.BaseCustomGrammarParser"] + modules_to_skip = ["parsers.BaseNodeParser", + "parsers.BaseCustomGrammarParser", + "parsers.BaseExpressionParser"] temp_result = {} for parser in core.utils.get_sub_classes("parsers", base_class): diff --git a/src/core/sheerka/services/SheerkaEvaluateConcept.py b/src/core/sheerka/services/SheerkaEvaluateConcept.py index 5d3d385..9e219ab 100644 --- a/src/core/sheerka/services/SheerkaEvaluateConcept.py +++ b/src/core/sheerka/services/SheerkaEvaluateConcept.py @@ -13,7 +13,7 @@ from core.tokenizer import Tokenizer from core.utils import unstr_concept from parsers.BaseNodeParser import ConceptNode from parsers.LogicalOperatorParser import LogicalOperatorParser -from parsers.expressions import TrueifyVisitor +from parsers.BaseExpressionParser import TrueifyVisitor CONCEPT_EVALUATION_STEPS = [ BuiltinConcepts.BEFORE_EVALUATION, diff --git a/src/core/sheerka/services/SheerkaRuleManager.py b/src/core/sheerka/services/SheerkaRuleManager.py index a0f58ed..45f9550 100644 --- a/src/core/sheerka/services/SheerkaRuleManager.py +++ b/src/core/sheerka/services/SheerkaRuleManager.py @@ -20,7 +20,7 @@ from evaluators.PythonEvaluator import PythonEvaluator, Expando from parsers.BaseNodeParser import SourceCodeWithConceptNode, ConceptNode, SourceCodeNode from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.PythonParser import PythonNode -from parsers.expressions import AndNode +from parsers.BaseExpressionParser import AndNode from sheerkarete.conditions import AndConditions CONCEPTS_ONLY_PARSERS = ["ExactConcept", "Bnf", "Sya", "Sequence"] diff --git a/src/parsers/expressions.py b/src/parsers/BaseExpressionParser.py similarity index 95% rename from src/parsers/expressions.py rename to src/parsers/BaseExpressionParser.py index 1b70455..e83387a 100644 --- a/src/parsers/expressions.py +++ b/src/parsers/BaseExpressionParser.py @@ -1,10 +1,11 @@ from dataclasses import dataclass from typing import List, Tuple, Union -from core.tokenizer import Token, TokenKind, Tokenizer +from core.sheerka.services.SheerkaExecute import ParserInput +from core.tokenizer import Token, TokenKind, Tokenizer, LexerError from core.utils import tokens_are_matching from parsers.BaseNodeParser import UnrecognizedTokensNode -from parsers.BaseParser import Node, ParsingError +from parsers.BaseParser import Node, ParsingError, BaseParser class ComparisonType: @@ -328,6 +329,23 @@ class FunctionNode(ExprNode): parameters: Union[None, List[FunctionParameter]] +class BaseExpressionParser(BaseParser): + + def parse_input(self, context, parser_input, error_sink): + raise NotImplementedError + + def reset_parser_input(self, parser_input: ParserInput, error_sink): + try: + error_sink.clear() + parser_input.reset(self.yield_eof) + except LexerError as e: + error_sink.add_error(e) + return False + + parser_input.next_token() + return True + + class ExpressionVisitor: """ Pyhtonic implementation of visitors for ExprNode diff --git a/src/parsers/BaseParser.py b/src/parsers/BaseParser.py index b7834c1..dba95a6 100644 --- a/src/parsers/BaseParser.py +++ b/src/parsers/BaseParser.py @@ -9,6 +9,21 @@ from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import TokenKind, Token, LexerError +class ErrorSink: + def __init__(self): + self.sink = [] + + def add_error(self, error): + self.sink.append(error) + + def clear(self): + self.sink.clear() + + @property + def has_error(self): + return len(self.sink) > 0 + + @dataclass() class Node: pass @@ -244,34 +259,3 @@ class BaseParserInputParser(BaseParser): return list_a - -class BaseExprParser(BaseParser): - - def parse_input(self, context, parser_input, error_sink): - raise NotImplementedError - - def reset_parser_input(self, parser_input: ParserInput, error_sink): - try: - error_sink.clear() - parser_input.reset(self.yield_eof) - except LexerError as e: - error_sink.add_error(e) - return False - - parser_input.next_token() - return True - - -class ErrorSink: - def __init__(self): - self.sink = [] - - def add_error(self, error): - self.sink.append(error) - - def clear(self): - self.sink.clear() - - @property - def has_error(self): - return len(self.sink) > 0 diff --git a/src/parsers/ExpressionParser.py b/src/parsers/ExpressionParser.py index d9437be..0865084 100644 --- a/src/parsers/ExpressionParser.py +++ b/src/parsers/ExpressionParser.py @@ -2,14 +2,14 @@ from core.builtin_concepts_ids import BuiltinConcepts from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import TokenKind from core.utils import get_text_from_tokens -from parsers.BaseParser import BaseExprParser, ErrorSink +from parsers.BaseParser import ErrorSink from parsers.FunctionParser import FunctionParser from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.RelationalOperatorParser import RelationalOperatorParser -from parsers.expressions import ParenthesisNode, NameExprNode, VariableNode +from parsers.BaseExpressionParser import ParenthesisNode, NameExprNode, VariableNode, BaseExpressionParser -class ExpressionParser(BaseExprParser): +class ExpressionParser(BaseExpressionParser): """ Parses expressions """ @@ -74,7 +74,7 @@ class ExpressionParser(BaseExprParser): return None -class VariableOrNamesParser(BaseExprParser): +class VariableOrNamesParser(BaseExpressionParser): NAME = "VariableOrNames" def __init__(self, **kwargs): diff --git a/src/parsers/FunctionParser.py b/src/parsers/FunctionParser.py index 2ec340c..430edba 100644 --- a/src/parsers/FunctionParser.py +++ b/src/parsers/FunctionParser.py @@ -7,14 +7,14 @@ from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import TokenKind from core.utils import get_n_clones from parsers.BaseNodeParser import SourceCodeNode, SourceCodeWithConceptNode -from parsers.BaseParser import UnexpectedTokenParsingError, UnexpectedEofParsingError, Node, BaseExprParser, \ +from parsers.BaseParser import UnexpectedTokenParsingError, UnexpectedEofParsingError, Node, \ BaseParserInputParser from parsers.BnfNodeParser import BnfNodeParser from parsers.PythonWithConceptsParser import PythonWithConceptsParser from parsers.RuleParser import RuleParser from parsers.SequenceNodeParser import SequenceNodeParser from parsers.SyaNodeParser import SyaNodeParser -from parsers.expressions import NameExprNode, FunctionNode, FunctionParameter +from parsers.BaseExpressionParser import NameExprNode, FunctionNode, FunctionParameter PARSERS = [RuleParser.NAME, SequenceNodeParser.NAME, diff --git a/src/parsers/LogicalOperatorParser.py b/src/parsers/LogicalOperatorParser.py index 8874988..b1a8a43 100644 --- a/src/parsers/LogicalOperatorParser.py +++ b/src/parsers/LogicalOperatorParser.py @@ -7,10 +7,10 @@ from core.sheerka.services.sheerka_service import FailedToCompileError from core.tokenizer import TokenKind, Tokenizer, Keywords from core.utils import get_text_from_tokens from parsers.BaseNodeParser import UnrecognizedTokensNode -from parsers.BaseParser import UnexpectedTokenParsingError, UnexpectedEofParsingError, BaseExprParser, ErrorSink +from parsers.BaseParser import UnexpectedTokenParsingError, UnexpectedEofParsingError, ErrorSink from parsers.PythonWithConceptsParser import PythonWithConceptsParser -from parsers.expressions import ParenthesisNode, OrNode, AndNode, NotNode, LeftPartNotFoundError, \ - ParenthesisMismatchError, NameExprNode, ExprNode, VariableNode, ComparisonNode +from parsers.BaseExpressionParser import ParenthesisNode, OrNode, AndNode, NotNode, LeftPartNotFoundError, \ + ParenthesisMismatchError, NameExprNode, ExprNode, VariableNode, ComparisonNode, BaseExpressionParser from sheerkarete.common import V from sheerkarete.conditions import Condition, AndConditions @@ -63,7 +63,7 @@ class ReteConditionsEmitter: return [AndConditions(conditions)] -class LogicalOperatorParser(BaseExprParser): +class LogicalOperatorParser(BaseExpressionParser): """ will parser logic expression like not (a and b or c) diff --git a/src/parsers/RelationalOperatorParser.py b/src/parsers/RelationalOperatorParser.py index e655ed1..bcc8ba7 100644 --- a/src/parsers/RelationalOperatorParser.py +++ b/src/parsers/RelationalOperatorParser.py @@ -2,12 +2,13 @@ from core.builtin_concepts_ids import BuiltinConcepts from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import TokenKind from core.utils import get_text_from_tokens -from parsers.BaseParser import UnexpectedTokenParsingError, BaseExprParser, ErrorSink -from parsers.expressions import ComparisonNode, ParenthesisMismatchError, NameExprNode, ComparisonType, VariableNode, \ - ParenthesisNode, LeftPartNotFoundError +from parsers.BaseParser import UnexpectedTokenParsingError, ErrorSink +from parsers.BaseExpressionParser import ComparisonNode, ParenthesisMismatchError, NameExprNode, ComparisonType, \ + VariableNode, \ + ParenthesisNode, LeftPartNotFoundError, BaseExpressionParser -class RelationalOperatorParser(BaseExprParser): +class RelationalOperatorParser(BaseExpressionParser): """ Parses xxx (== | > | < | >= | <= | != | in | not in) yyy Nothing else diff --git a/tests/parsers/parsers_utils.py b/tests/parsers/parsers_utils.py index a180ec8..ac083a1 100644 --- a/tests/parsers/parsers_utils.py +++ b/tests/parsers/parsers_utils.py @@ -13,7 +13,7 @@ from parsers.BaseNodeParser import UnrecognizedTokensNode, SourceCodeNode, RuleN from parsers.FunctionParser import FunctionNode from parsers.PythonParser import PythonNode from parsers.SyaNodeParser import SyaConceptParserHelper -from parsers.expressions import NameExprNode, AndNode, OrNode, NotNode, VariableNode, ComparisonNode, ComparisonType, \ +from parsers.BaseExpressionParser import NameExprNode, AndNode, OrNode, NotNode, VariableNode, ComparisonNode, ComparisonType, \ FunctionParameter from sheerkarete.common import V from sheerkarete.conditions import Condition, AndConditions diff --git a/tests/parsers/test_ExpressionParser.py b/tests/parsers/test_ExpressionParser.py index 075b7b3..af21d4d 100644 --- a/tests/parsers/test_ExpressionParser.py +++ b/tests/parsers/test_ExpressionParser.py @@ -5,7 +5,7 @@ from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import Tokenizer from parsers.BaseParser import ErrorSink from parsers.ExpressionParser import ExpressionParser -from parsers.expressions import VariableNode +from parsers.BaseExpressionParser import VariableNode from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka from tests.parsers.parsers_utils import get_expr_node_from_test_node, VAR, EXPR, AND, OR, NOT, GT, GTE, LT, LTE, EQ, \ NEQ, IN, NIN diff --git a/tests/parsers/test_LogicalOperatorParser.py b/tests/parsers/test_LogicalOperatorParser.py index 2810915..14ddf97 100644 --- a/tests/parsers/test_LogicalOperatorParser.py +++ b/tests/parsers/test_LogicalOperatorParser.py @@ -10,7 +10,7 @@ from core.tokenizer import TokenKind from parsers.BaseParser import UnexpectedEofParsingError, UnexpectedTokenParsingError from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.PythonParser import PythonNode -from parsers.expressions import TrueifyVisitor, IsAQuestionVisitor, AndNode, LeftPartNotFoundError, \ +from parsers.BaseExpressionParser import TrueifyVisitor, IsAQuestionVisitor, AndNode, LeftPartNotFoundError, \ ParenthesisMismatchError from sheerkarete.network import ReteNetwork from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka diff --git a/tests/parsers/test_RelationalOperatorParser.py b/tests/parsers/test_RelationalOperatorParser.py index b9b6315..3c407de 100644 --- a/tests/parsers/test_RelationalOperatorParser.py +++ b/tests/parsers/test_RelationalOperatorParser.py @@ -5,7 +5,7 @@ from core.sheerka.services.SheerkaExecute import ParserInput from core.tokenizer import TokenKind from parsers.BaseParser import UnexpectedTokenParsingError from parsers.RelationalOperatorParser import RelationalOperatorParser -from parsers.expressions import ParenthesisMismatchError +from parsers.BaseExpressionParser 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