078d8e5df6
Fixing unit tests. Continuing SyaParser
62 lines
2.7 KiB
Python
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])
|