Working on #48 : Working

This commit is contained in:
2021-03-11 15:28:24 +01:00
parent 8f51893f53
commit 30c99b2d67
14 changed files with 60 additions and 55 deletions
+1 -1
View File
@@ -790,7 +790,7 @@ def is_a_question(context, concept):
return False return False
node = res.body.body node = res.body.body
from parsers.expressions import IsAQuestionVisitor from parsers.BaseExpressionParser import IsAQuestionVisitor
return IsAQuestionVisitor().is_a_question(node) return IsAQuestionVisitor().is_a_question(node)
+3 -1
View File
@@ -278,7 +278,9 @@ class Sheerka(Concept):
""" """
core.utils.import_module_and_sub_module("parsers") core.utils.import_module_and_sub_module("parsers")
base_class = core.utils.get_class("parsers.BaseParser.BaseParser") 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 = {} temp_result = {}
for parser in core.utils.get_sub_classes("parsers", base_class): for parser in core.utils.get_sub_classes("parsers", base_class):
@@ -13,7 +13,7 @@ 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.LogicalOperatorParser import LogicalOperatorParser from parsers.LogicalOperatorParser import LogicalOperatorParser
from parsers.expressions import TrueifyVisitor from parsers.BaseExpressionParser import TrueifyVisitor
CONCEPT_EVALUATION_STEPS = [ CONCEPT_EVALUATION_STEPS = [
BuiltinConcepts.BEFORE_EVALUATION, BuiltinConcepts.BEFORE_EVALUATION,
@@ -20,7 +20,7 @@ from evaluators.PythonEvaluator import PythonEvaluator, Expando
from parsers.BaseNodeParser import SourceCodeWithConceptNode, ConceptNode, SourceCodeNode from parsers.BaseNodeParser import SourceCodeWithConceptNode, ConceptNode, SourceCodeNode
from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.LogicalOperatorParser import LogicalOperatorParser
from parsers.PythonParser import PythonNode from parsers.PythonParser import PythonNode
from parsers.expressions import AndNode from parsers.BaseExpressionParser 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"]
@@ -1,10 +1,11 @@
from dataclasses import dataclass from dataclasses import dataclass
from typing import List, Tuple, Union 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 core.utils import tokens_are_matching
from parsers.BaseNodeParser import UnrecognizedTokensNode from parsers.BaseNodeParser import UnrecognizedTokensNode
from parsers.BaseParser import Node, ParsingError from parsers.BaseParser import Node, ParsingError, BaseParser
class ComparisonType: class ComparisonType:
@@ -328,6 +329,23 @@ class FunctionNode(ExprNode):
parameters: Union[None, List[FunctionParameter]] 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: class ExpressionVisitor:
""" """
Pyhtonic implementation of visitors for ExprNode Pyhtonic implementation of visitors for ExprNode
+15 -31
View File
@@ -9,6 +9,21 @@ from core.sheerka.services.SheerkaExecute import ParserInput
from core.tokenizer import TokenKind, Token, LexerError 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() @dataclass()
class Node: class Node:
pass pass
@@ -244,34 +259,3 @@ class BaseParserInputParser(BaseParser):
return list_a 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
+4 -4
View File
@@ -2,14 +2,14 @@ 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 from core.tokenizer import TokenKind
from core.utils import get_text_from_tokens 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.FunctionParser import FunctionParser
from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.LogicalOperatorParser import LogicalOperatorParser
from parsers.RelationalOperatorParser import RelationalOperatorParser 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 Parses expressions
""" """
@@ -74,7 +74,7 @@ class ExpressionParser(BaseExprParser):
return None return None
class VariableOrNamesParser(BaseExprParser): class VariableOrNamesParser(BaseExpressionParser):
NAME = "VariableOrNames" NAME = "VariableOrNames"
def __init__(self, **kwargs): def __init__(self, **kwargs):
+2 -2
View File
@@ -7,14 +7,14 @@ from core.sheerka.services.SheerkaExecute import ParserInput
from core.tokenizer import TokenKind from core.tokenizer import TokenKind
from core.utils import get_n_clones from core.utils import get_n_clones
from parsers.BaseNodeParser import SourceCodeNode, SourceCodeWithConceptNode from parsers.BaseNodeParser import SourceCodeNode, SourceCodeWithConceptNode
from parsers.BaseParser import UnexpectedTokenParsingError, UnexpectedEofParsingError, Node, BaseExprParser, \ from parsers.BaseParser import UnexpectedTokenParsingError, UnexpectedEofParsingError, Node, \
BaseParserInputParser BaseParserInputParser
from parsers.BnfNodeParser import BnfNodeParser from parsers.BnfNodeParser import BnfNodeParser
from parsers.PythonWithConceptsParser import PythonWithConceptsParser from parsers.PythonWithConceptsParser import PythonWithConceptsParser
from parsers.RuleParser import RuleParser from parsers.RuleParser import RuleParser
from parsers.SequenceNodeParser import SequenceNodeParser from parsers.SequenceNodeParser import SequenceNodeParser
from parsers.SyaNodeParser import SyaNodeParser from parsers.SyaNodeParser import SyaNodeParser
from parsers.expressions import NameExprNode, FunctionNode, FunctionParameter from parsers.BaseExpressionParser import NameExprNode, FunctionNode, FunctionParameter
PARSERS = [RuleParser.NAME, PARSERS = [RuleParser.NAME,
SequenceNodeParser.NAME, SequenceNodeParser.NAME,
+4 -4
View File
@@ -7,10 +7,10 @@ from core.sheerka.services.sheerka_service import FailedToCompileError
from core.tokenizer import TokenKind, Tokenizer, Keywords from core.tokenizer import TokenKind, Tokenizer, Keywords
from core.utils import get_text_from_tokens from core.utils import get_text_from_tokens
from parsers.BaseNodeParser import UnrecognizedTokensNode 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.PythonWithConceptsParser import PythonWithConceptsParser
from parsers.expressions import ParenthesisNode, OrNode, AndNode, NotNode, LeftPartNotFoundError, \ from parsers.BaseExpressionParser import ParenthesisNode, OrNode, AndNode, NotNode, LeftPartNotFoundError, \
ParenthesisMismatchError, NameExprNode, ExprNode, VariableNode, ComparisonNode ParenthesisMismatchError, NameExprNode, ExprNode, VariableNode, ComparisonNode, BaseExpressionParser
from sheerkarete.common import V from sheerkarete.common import V
from sheerkarete.conditions import Condition, AndConditions from sheerkarete.conditions import Condition, AndConditions
@@ -63,7 +63,7 @@ class ReteConditionsEmitter:
return [AndConditions(conditions)] return [AndConditions(conditions)]
class LogicalOperatorParser(BaseExprParser): class LogicalOperatorParser(BaseExpressionParser):
""" """
will parser logic expression will parser logic expression
like not (a and b or c) like not (a and b or c)
+5 -4
View File
@@ -2,12 +2,13 @@ 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 from core.tokenizer import TokenKind
from core.utils import get_text_from_tokens from core.utils import get_text_from_tokens
from parsers.BaseParser import UnexpectedTokenParsingError, BaseExprParser, ErrorSink from parsers.BaseParser import UnexpectedTokenParsingError, ErrorSink
from parsers.expressions import ComparisonNode, ParenthesisMismatchError, NameExprNode, ComparisonType, VariableNode, \ from parsers.BaseExpressionParser import ComparisonNode, ParenthesisMismatchError, NameExprNode, ComparisonType, \
ParenthesisNode, LeftPartNotFoundError VariableNode, \
ParenthesisNode, LeftPartNotFoundError, BaseExpressionParser
class RelationalOperatorParser(BaseExprParser): class RelationalOperatorParser(BaseExpressionParser):
""" """
Parses xxx (== | > | < | >= | <= | != | in | not in) yyy Parses xxx (== | > | < | >= | <= | != | in | not in) yyy
Nothing else Nothing else
+1 -1
View File
@@ -13,7 +13,7 @@ from parsers.BaseNodeParser import UnrecognizedTokensNode, SourceCodeNode, RuleN
from parsers.FunctionParser import FunctionNode from parsers.FunctionParser import FunctionNode
from parsers.PythonParser import PythonNode from parsers.PythonParser import PythonNode
from parsers.SyaNodeParser import SyaConceptParserHelper 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 FunctionParameter
from sheerkarete.common import V from sheerkarete.common import V
from sheerkarete.conditions import Condition, AndConditions from sheerkarete.conditions import Condition, AndConditions
+1 -1
View File
@@ -5,7 +5,7 @@ from core.sheerka.services.SheerkaExecute import ParserInput
from core.tokenizer import Tokenizer from core.tokenizer import Tokenizer
from parsers.BaseParser import ErrorSink from parsers.BaseParser import ErrorSink
from parsers.ExpressionParser import ExpressionParser from parsers.ExpressionParser import ExpressionParser
from parsers.expressions import VariableNode from parsers.BaseExpressionParser import VariableNode
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka 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, \ 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 NEQ, IN, NIN
+1 -1
View File
@@ -10,7 +10,7 @@ from core.tokenizer import TokenKind
from parsers.BaseParser import UnexpectedEofParsingError, UnexpectedTokenParsingError from parsers.BaseParser import UnexpectedEofParsingError, UnexpectedTokenParsingError
from parsers.LogicalOperatorParser import LogicalOperatorParser from parsers.LogicalOperatorParser import LogicalOperatorParser
from parsers.PythonParser import PythonNode from parsers.PythonParser import PythonNode
from parsers.expressions import TrueifyVisitor, IsAQuestionVisitor, AndNode, LeftPartNotFoundError, \ from parsers.BaseExpressionParser import TrueifyVisitor, IsAQuestionVisitor, AndNode, LeftPartNotFoundError, \
ParenthesisMismatchError ParenthesisMismatchError
from sheerkarete.network import ReteNetwork from sheerkarete.network import ReteNetwork
from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka from tests.TestUsingMemoryBasedSheerka import TestUsingMemoryBasedSheerka
@@ -5,7 +5,7 @@ from core.sheerka.services.SheerkaExecute import ParserInput
from core.tokenizer import TokenKind from core.tokenizer import TokenKind
from parsers.BaseParser import UnexpectedTokenParsingError from parsers.BaseParser import UnexpectedTokenParsingError
from parsers.RelationalOperatorParser import RelationalOperatorParser from parsers.RelationalOperatorParser import RelationalOperatorParser
from parsers.expressions import ParenthesisMismatchError from parsers.BaseExpressionParser 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