Files
Sheerka/src/evaluators/RecognizeSimpleConcept.py
T
kodjo 078d8e5df6 Restarting the project.
Fixing unit tests. Continuing SyaParser
2026-04-12 09:40:04 +02:00

62 lines
2.7 KiB
Python

from core.BuiltinConcepts import BuiltinConcepts
from core.ExecutionContext import ContextActions, ExecutionContext
from core.ReturnValue import ReturnValue
from core.concept import Concept
from evaluators.base_evaluator import EvaluatorEvalResult, EvaluatorMatchResult, NotForMe, OneReturnValueEvaluator
from parsers.SimpleConceptsParser import SimpleConceptsParser
from parsers.state_machine import MetadataToken
class RecognizeSimpleConcept(OneReturnValueEvaluator):
"""
class that recognizes concepts in the input
It only focuses on concepts thot do not require parameter
"""
NAME = "RecognizeSimpleConcept"
def __init__(self):
super().__init__(self.NAME, ContextActions.PARSING, 80)
self.parser = SimpleConceptsParser()
def matches(self, context: ExecutionContext, return_value: ReturnValue) -> EvaluatorMatchResult:
return EvaluatorMatchResult(return_value.status and
context.sheerka.isinstance(return_value.value, BuiltinConcepts.PARSER_INPUT))
def eval(self, context: ExecutionContext,
evaluation_context: object,
return_value: ReturnValue) -> EvaluatorEvalResult:
parser_input = return_value.value.body
parser_input.reset()
error_sink = []
parsed = self.parser.parse(context, parser_input, error_sink)
if len(parsed.items) == 0:
not_for_me = ReturnValue(self.NAME, False, NotForMe(self.NAME, return_value.value))
return EvaluatorEvalResult([not_for_me], [])
new = []
for sequence in parsed.items:
instantiated = []
has_unrecognized = False
for item in sequence:
# instantiate the concept
if isinstance(item, MetadataToken):
concept = context.sheerka.newi(item.metadata.id)
concept.get_runtime_info().info["resolution_method"] = item.resolution_method
instantiated.append(concept)
else:
instantiated.append(item.buffer)
has_unrecognized = True
if has_unrecognized:
parser_result = context.sheerka.newn(BuiltinConcepts.PARSER_RESULT, result=instantiated)
new.append(ReturnValue(self.NAME, False, parser_result, [return_value]))
else:
# remove whitespaces first
instantiated = [item for item in instantiated if isinstance(item, Concept) or not item.isspace()]
to_return = instantiated[0] if len(instantiated) == 1 else instantiated
new.append(ReturnValue(self.NAME, True, to_return, [return_value]))
return EvaluatorEvalResult(new, [return_value])