Implemented FunctionParser
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import core.utils
|
||||
from core.builtin_concepts import ParserResultConcept, ReturnValueConcept, BuiltinConcepts
|
||||
from core.concept import Concept, DEFINITION_TYPE_BNF, DEFINITION_TYPE_DEF
|
||||
from core.sheerka.services.SheerkaExecute import ParserInput
|
||||
from core.tokenizer import TokenKind, Tokenizer
|
||||
from evaluators.BaseEvaluator import OneReturnValueEvaluator
|
||||
from parsers.BaseParser import NotInitializedNode
|
||||
@@ -67,7 +68,8 @@ class AddConceptEvaluator(OneReturnValueEvaluator):
|
||||
elif isinstance(part_ret_val, NameNode):
|
||||
source = str(part_ret_val)
|
||||
elif isinstance(part_ret_val, ReturnValueConcept) and part_ret_val.status:
|
||||
source = part_ret_val.value.source
|
||||
source = part_ret_val.value.source.as_text() if isinstance(part_ret_val.value.source,
|
||||
ParserInput) else part_ret_val.value.source
|
||||
else:
|
||||
raise Exception("Unexpected")
|
||||
setattr(concept.metadata, prop, source)
|
||||
@@ -143,7 +145,9 @@ class AddConceptEvaluator(OneReturnValueEvaluator):
|
||||
#
|
||||
if isinstance(ret_value.value, ParserResultConcept) and len(concept_name) > 1:
|
||||
variables = set()
|
||||
tokens = ret_value.value.tokens or list(Tokenizer(ret_value.value.source, yield_eof=False))
|
||||
source = ret_value.value.source.as_text() if isinstance(ret_value.value.source,
|
||||
ParserInput) else ret_value.value.source
|
||||
tokens = ret_value.value.tokens or list(Tokenizer(source, yield_eof=False))
|
||||
tokens = [t.str_value for t in tokens]
|
||||
for identifier in [i for i in concept_name if str(i).isalnum()]:
|
||||
if identifier in tokens:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from core.builtin_concepts import ParserResultConcept, BuiltinConcepts
|
||||
from evaluators.BaseEvaluator import OneReturnValueEvaluator
|
||||
from parsers.BaseNodeParser import SourceCodeNode, ConceptNode
|
||||
from parsers.PythonParser import LexerNodeParserHelperForPython, PythonNode
|
||||
from parsers.PythonWithConceptsParser import PythonWithConceptsParser
|
||||
|
||||
|
||||
class LexerNodeEvaluator(OneReturnValueEvaluator):
|
||||
@@ -82,19 +82,10 @@ class LexerNodeEvaluator(OneReturnValueEvaluator):
|
||||
def evaluate_python_code(self, context, nodes):
|
||||
sheerka = context.sheerka
|
||||
|
||||
helper = LexerNodeParserHelperForPython()
|
||||
result = helper.parse(context, nodes)
|
||||
|
||||
if isinstance(result, PythonNode):
|
||||
return sheerka.ret(
|
||||
self.name,
|
||||
True,
|
||||
sheerka.new(
|
||||
BuiltinConcepts.PARSER_RESULT,
|
||||
parser=self,
|
||||
source=result.source,
|
||||
body=result,
|
||||
try_parsed=None))
|
||||
parser = PythonWithConceptsParser()
|
||||
result = parser.parse_nodes(context, nodes)
|
||||
if result:
|
||||
return result
|
||||
else:
|
||||
return sheerka.ret(
|
||||
self.name,
|
||||
|
||||
@@ -40,6 +40,7 @@ class Expando:
|
||||
def __repr__(self):
|
||||
return f"{dir(self)}"
|
||||
|
||||
|
||||
@dataclass
|
||||
class PythonEvalError:
|
||||
error: Exception
|
||||
@@ -59,13 +60,19 @@ class PythonEvaluator(OneReturnValueEvaluator):
|
||||
self.globals = {}
|
||||
|
||||
def matches(self, context, return_value):
|
||||
return return_value.status and \
|
||||
isinstance(return_value.value, ParserResultConcept) and \
|
||||
isinstance(return_value.value.value, PythonNode)
|
||||
if not return_value.status or not isinstance(return_value.value, ParserResultConcept):
|
||||
return False
|
||||
body = return_value.value.value
|
||||
return isinstance(body, PythonNode) or (
|
||||
hasattr(body, "python_node") and isinstance(body.python_node, PythonNode))
|
||||
# return return_value.status and \
|
||||
# isinstance(return_value.value, ParserResultConcept) and \
|
||||
# isinstance(return_value.value.value, PythonNode)
|
||||
|
||||
def eval(self, context, return_value):
|
||||
sheerka = context.sheerka
|
||||
node = return_value.value.value
|
||||
node = return_value.value.value if isinstance(return_value.value.value, PythonNode) else \
|
||||
return_value.value.value.python_node
|
||||
|
||||
context.log(f"Evaluating python node {node}.", self.name)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user