Implemented FunctionParser

This commit is contained in:
2020-09-17 14:11:09 +02:00
parent 8a866880bc
commit 177a6b1d5f
40 changed files with 1752 additions and 561 deletions
+6 -2
View File
@@ -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:
+5 -14
View File
@@ -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,
+11 -4
View File
@@ -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)