Added simple form of concept composition
This commit is contained in:
@@ -1,109 +0,0 @@
|
||||
# from core.builtin_concepts import BuiltinConcepts, ParserResultConcept
|
||||
# from core.concept import Concept
|
||||
# from core.tokenizer import TokenKind
|
||||
# from evaluators.BaseEvaluator import AllReturnValuesEvaluator, BaseEvaluator
|
||||
# from parsers.BaseParser import BaseParser
|
||||
# from parsers.ConceptLexerParser import ConceptNode, UnrecognizedTokensNode, ConceptLexerParser
|
||||
# import core.utils
|
||||
#
|
||||
#
|
||||
# class ConceptComposerEvaluator(AllReturnValuesEvaluator):
|
||||
# """
|
||||
# Try to reassemble parts of concepts from different evaluators
|
||||
# """
|
||||
#
|
||||
# NAME = "ConceptComposer"
|
||||
#
|
||||
# def __init__(self):
|
||||
# super().__init__(self.NAME, [BuiltinConcepts.EVALUATION], 40)
|
||||
#
|
||||
# def matches(self, context, return_values):
|
||||
# concept_lexer_parser_name = ConceptLexerParser().name
|
||||
#
|
||||
# for return_value in return_values:
|
||||
# if return_value.who.startswith(BaseParser.PREFIX) and return_value.status:
|
||||
# return False
|
||||
#
|
||||
# if return_value.who.startswith(BaseEvaluator.PREFIX):
|
||||
# return False
|
||||
#
|
||||
# if return_value.who != concept_lexer_parser_name:
|
||||
# continue
|
||||
#
|
||||
# if not isinstance(return_value.value, ParserResultConcept):
|
||||
# return False
|
||||
#
|
||||
# if not (
|
||||
# isinstance(return_value.value.value, ConceptNode) or
|
||||
# isinstance(return_value.value.value, UnrecognizedTokensNode) or
|
||||
# (
|
||||
# hasattr(return_value.value.value, "__iter__") and
|
||||
# len(return_value.value.value) > 0 and
|
||||
# (
|
||||
# isinstance(return_value.value.value[0], ConceptNode) or
|
||||
# isinstance(return_value.value.value[0], UnrecognizedTokensNode)
|
||||
# ))):
|
||||
# return False
|
||||
#
|
||||
# self.eaten = return_value
|
||||
# return True
|
||||
#
|
||||
# return False
|
||||
#
|
||||
# def eval(self, context, return_value):
|
||||
# sheerka = context.sheerka
|
||||
# nodes = self.eaten.value.value
|
||||
# temp_res = []
|
||||
# has_error = False
|
||||
# concepts_only = True
|
||||
#
|
||||
# for node in nodes:
|
||||
# if isinstance(node, UnrecognizedTokensNode):
|
||||
# tokens = core.utils.strip_tokens(node.tokens, True)
|
||||
# for token in tokens:
|
||||
# if token.type == TokenKind.IDENTIFIER:
|
||||
# concept = context.new_concept(token.value)
|
||||
# if sheerka.isinstance(concept, BuiltinConcepts.UNKNOWN_CONCEPT):
|
||||
# has_error = True
|
||||
# else:
|
||||
# with context.push(self.name, desc=f"Evaluating '{concept}'") as sub_context:
|
||||
# sub_context.log_new(self.verbose_log)
|
||||
# concept = sheerka.evaluate_concept(sub_context, concept, self.verbose_log)
|
||||
# sub_context.add_values(return_values=concept)
|
||||
# temp_res.append(concept)
|
||||
#
|
||||
# else:
|
||||
# temp_res.append(core.utils.strip_quotes(token.value))
|
||||
# concepts_only &= token.type == TokenKind.WHITESPACE or token.type == TokenKind.NEWLINE
|
||||
# else:
|
||||
# with context.push(self.name, desc=f"Evaluating '{node.concept}'") as sub_context:
|
||||
# sub_context.log_new(self.verbose_log)
|
||||
# concept = sheerka.evaluate_concept(sub_context, node.concept, self.verbose_log)
|
||||
# sub_context.add_values(return_values=concept)
|
||||
# temp_res.append(concept)
|
||||
#
|
||||
# if has_error:
|
||||
# return sheerka.ret(
|
||||
# self.name,
|
||||
# False,
|
||||
# temp_res,
|
||||
# parents=[self.eaten])
|
||||
#
|
||||
# if concepts_only:
|
||||
# res = []
|
||||
# for r in temp_res:
|
||||
# if isinstance(r, Concept):
|
||||
# res.append(r)
|
||||
# else:
|
||||
# res = ""
|
||||
# for r in temp_res:
|
||||
# if isinstance(r, Concept):
|
||||
# res += sheerka.value(r)
|
||||
# else:
|
||||
# res += r
|
||||
#
|
||||
# return sheerka.ret(
|
||||
# self.name,
|
||||
# True,
|
||||
# res,
|
||||
# parents=[self.eaten])
|
||||
@@ -1,68 +0,0 @@
|
||||
from core.builtin_concepts import ParserResultConcept, BuiltinConcepts
|
||||
from evaluators.BaseEvaluator import OneReturnValueEvaluator
|
||||
from parsers.ConceptLexerParser import ConceptNode, UnrecognizedTokensNode
|
||||
|
||||
|
||||
class ConceptNodeEvaluator(OneReturnValueEvaluator):
|
||||
"""
|
||||
After a BNF is recognized, generates the concept or the list concepts
|
||||
"""
|
||||
|
||||
NAME = "ConceptNode"
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(self.NAME, [BuiltinConcepts.EVALUATION], 60)
|
||||
|
||||
def matches(self, context, return_value):
|
||||
if not return_value.status:
|
||||
return False
|
||||
|
||||
if not isinstance(return_value.value, ParserResultConcept):
|
||||
return False
|
||||
|
||||
return (
|
||||
isinstance(return_value.value.value, ConceptNode) or
|
||||
isinstance(return_value.value.value, UnrecognizedTokensNode) or
|
||||
(
|
||||
hasattr(return_value.value.value, "__iter__") and
|
||||
len(return_value.value.value) > 0 and
|
||||
(
|
||||
isinstance(return_value.value.value[0], ConceptNode) or
|
||||
isinstance(return_value.value.value[0], UnrecognizedTokensNode)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
def eval(self, context, return_value):
|
||||
"""
|
||||
From a concept node, creates a new concept
|
||||
and makes sure that the properties are correctly set
|
||||
"""
|
||||
sheerka = context.sheerka
|
||||
nodes = return_value.value.value
|
||||
if not hasattr(nodes, "__iter__"):
|
||||
nodes = [nodes]
|
||||
|
||||
concepts = []
|
||||
error_found = False
|
||||
source = ""
|
||||
for node in nodes:
|
||||
if isinstance(node, ConceptNode):
|
||||
source += node.source if source == "" else (" " + node.source)
|
||||
concepts.append(node.concept)
|
||||
else:
|
||||
error_found = True
|
||||
|
||||
if len(concepts) == 1:
|
||||
return sheerka.ret(
|
||||
self.name,
|
||||
not error_found,
|
||||
context.sheerka.new(
|
||||
BuiltinConcepts.PARSER_RESULT,
|
||||
parser=self,
|
||||
source=source,
|
||||
body=concepts[0],
|
||||
try_parsed=None),
|
||||
parents=[return_value])
|
||||
|
||||
return sheerka.ret(self.name, False, sheerka.new(BuiltinConcepts.NOT_FOR_ME), parents=[return_value])
|
||||
@@ -0,0 +1,102 @@
|
||||
from core.builtin_concepts import ParserResultConcept, BuiltinConcepts
|
||||
from evaluators.BaseEvaluator import OneReturnValueEvaluator
|
||||
from parsers.ConceptLexerParser import ConceptNode, UnrecognizedTokensNode, SourceCodeNode
|
||||
from parsers.PythonParser import LexerNodeParserHelperForPython, PythonNode
|
||||
|
||||
|
||||
class LexerNodeEvaluator(OneReturnValueEvaluator):
|
||||
"""
|
||||
After a BNF is recognized, generates the concept or the list concepts
|
||||
"""
|
||||
|
||||
NAME = "LexerNode"
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(self.NAME, [BuiltinConcepts.EVALUATION], 60)
|
||||
self.identifiers = {} # cache for already created identifier (the key is id(concept))
|
||||
self.identifiers_key = {} # number of identifiers with the same root (prefix)
|
||||
|
||||
def matches(self, context, return_value):
|
||||
if not return_value.status:
|
||||
return False
|
||||
|
||||
if not isinstance(return_value.value, ParserResultConcept):
|
||||
return False
|
||||
|
||||
value = return_value.value.value
|
||||
if isinstance(value, (ConceptNode, SourceCodeNode)):
|
||||
return True
|
||||
|
||||
if hasattr(value, "__iter__"):
|
||||
for node in value:
|
||||
if not isinstance(node, (ConceptNode, SourceCodeNode)):
|
||||
return False
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def eval(self, context, return_value):
|
||||
"""
|
||||
From a concept node, creates a new concept
|
||||
and makes sure that the properties are correctly set
|
||||
"""
|
||||
nodes = return_value.value.value
|
||||
if not hasattr(nodes, "__iter__"):
|
||||
nodes = [nodes]
|
||||
|
||||
context.log(self.verbose_log, f"{nodes=}", self.name)
|
||||
|
||||
for node in nodes:
|
||||
if isinstance(node, SourceCodeNode):
|
||||
ret = self.evaluate_python_code(context, nodes)
|
||||
break
|
||||
else:
|
||||
ret = self.evaluate_concepts_only(context, nodes)
|
||||
|
||||
ret.parents = [return_value]
|
||||
return ret
|
||||
|
||||
def evaluate_concepts_only(self, context, nodes):
|
||||
concepts = []
|
||||
source = ""
|
||||
sheerka = context.sheerka
|
||||
|
||||
for node in nodes:
|
||||
if isinstance(node, ConceptNode):
|
||||
source += node.source if source == "" else (" " + node.source)
|
||||
concepts.append(node.concept)
|
||||
|
||||
if len(concepts) == 1:
|
||||
return sheerka.ret(
|
||||
self.name,
|
||||
True,
|
||||
context.sheerka.new(
|
||||
BuiltinConcepts.PARSER_RESULT,
|
||||
parser=self,
|
||||
source=source,
|
||||
body=concepts[0],
|
||||
try_parsed=None))
|
||||
|
||||
return sheerka.ret(self.name, False, sheerka.new(BuiltinConcepts.NOT_FOR_ME, body=nodes))
|
||||
|
||||
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))
|
||||
else:
|
||||
return sheerka.ret(
|
||||
self.name,
|
||||
False,
|
||||
result.body)
|
||||
Reference in New Issue
Block a user