Working on #48 : Working

This commit is contained in:
2021-03-09 09:33:50 +01:00
parent a799ab2bbd
commit 07f0d3670d
6 changed files with 94 additions and 26 deletions
+7 -3
View File
@@ -18,9 +18,9 @@ from sheerkarete.conditions import Condition, AndConditions
class ReteConditionsEmitter:
def __init__(self, context):
from parsers.ComparisonParser import ComparisonParser
from parsers.RelationalOperatorParser import RelationalOperatorParser
self.context = context
self.comparison_parser = ComparisonParser()
self.comparison_parser = RelationalOperatorParser()
self.var_counter = 0
self.variables = {}
@@ -69,8 +69,10 @@ class LogicalOperatorParser(BaseParser):
Or to help to understand why a python expression returns True or False
"""
NAME = "LogicalOperator"
def __init__(self, **kwargs):
super().__init__("Expression", 50, False, yield_eof=True)
super().__init__(self.NAME, 50, False, yield_eof=True)
self.and_tokens = list(Tokenizer(" and ", yield_eof=False))
self.and_not_tokens = list(Tokenizer(" and not ", yield_eof=False))
self.not_tokens = list(Tokenizer("not ", yield_eof=False))
@@ -111,6 +113,8 @@ class LogicalOperatorParser(BaseParser):
if token and token.type != TokenKind.EOF:
self.add_error(UnexpectedTokenParsingError(f"Unexpected token '{token}'", token, []))
if isinstance(tree, ParenthesisNode):
tree = tree.node
value = self.get_return_value_body(context.sheerka, self.parser_input.as_text(), tree, tree)
ret = self.sheerka.ret(
@@ -4,11 +4,12 @@ from core.builtin_concepts_ids import BuiltinConcepts
from core.sheerka.services.SheerkaExecute import ParserInput, SheerkaExecute
from core.tokenizer import TokenKind, Token
from core.utils import get_text_from_tokens
from parsers.BaseParser import BaseParser
from parsers.expressions import ComparisonNode, ParenthesisMismatchError, NameExprNode, ComparisonType, VariableNode
from parsers.BaseParser import BaseParser, UnexpectedTokenParsingError
from parsers.expressions import ComparisonNode, ParenthesisMismatchError, NameExprNode, ComparisonType, VariableNode, \
ParenthesisNode, LeftPartNotFoundError
class ComparisonParser(BaseParser):
class RelationalOperatorParser(BaseParser):
"""
Parses xxx (== | > | < | >= | <= | != | in | not in) yyy
Nothing else
@@ -47,6 +48,8 @@ class ComparisonParser(BaseParser):
self.parser_input.next_token()
node = self.parse_compare()
if isinstance(node, ParenthesisNode):
node = node.node
value = self.get_return_value_body(context.sheerka, self.parser_input.as_text(), node, node)
@@ -67,21 +70,42 @@ class ComparisonParser(BaseParser):
return left
right = self.parse_names()
if isinstance(right, ParenthesisNode):
right = right.node
end = right.end if right else self.parser_input.pos
return ComparisonNode(start, end, self.parser_input.tokens[start: end + 1], comp, left, right)
def parse_names(self):
def stop():
return token.type == TokenKind.EOF or \
paren_count == 0 and token.type == TokenKind.RPAR or \
self.eat_comparison(False)
token = self.parser_input.token
if token.type == TokenKind.EOF:
return None
if token.type == TokenKind.LPAR:
start = self.parser_input.pos
self.parser_input.next_token()
expr = self.parse_compare()
token = self.parser_input.token
if token.type != TokenKind.RPAR:
self.error_sink.append(
UnexpectedTokenParsingError(f"Unexpected token '{token}'", token, [TokenKind.RPAR]))
return expr
end = self.parser_input.pos
self.parser_input.next_token()
return ParenthesisNode(start, end, None, expr)
buffer = []
paren_count = 0
last_lparen = None
last_rparen = None
start = self.parser_input.pos
while (paren_count > 0 or not self.eat_comparison(False)) and token.type != TokenKind.EOF:
while not stop():
buffer.append(token)
if token.type == TokenKind.LPAR:
last_lparen = token
@@ -92,8 +116,10 @@ class ComparisonParser(BaseParser):
self.parser_input.next_token(False)
token = self.parser_input.token
if paren_count != 0:
pass
if len(buffer) == 0:
if token.type != TokenKind.RPAR:
self.error_sink.append(LeftPartNotFoundError())
return None
if paren_count > 0:
self.error_sink.append(ParenthesisMismatchError(last_lparen))
+8 -2
View File
@@ -224,14 +224,20 @@ class ParenthesisNode(ExprNode):
if self.start != other.start or self.end != other.end:
return False
if other.tokens is not None and other.tokens != self.tokens:
return False
# if other.tokens is not None and other.tokens != self.tokens:
# return False
return self.node == other.node
def __hash__(self):
return hash((self.start, self.end, self.node))
def __repr__(self):
return f"ParenthesisNode(start={self.start}, end={self.end}, node={self.node!r})"
def __str__(self):
return f"({self.node})"
class VariableNode(ExprNode):
def __init__(self, start, end, tokens, name, *attributes):