Fixed #101 : Implement PLURIAL
Fixed #103 : Implement PlurialNodeParser Fixed #104 : Implement dynamic concept Fixed #107 : PrepareEvalxxxEvaluator: context hints are lost on a second evaluation
This commit is contained in:
@@ -4,6 +4,7 @@ from core import builtin_helpers
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.builtin_helpers import update_concepts_hints
|
||||
from core.concept import DEFINITION_TYPE_BNF, Concept
|
||||
from core.global_symbols import NotFound
|
||||
from core.sheerka.services.SheerkaExecute import ParserInput
|
||||
from core.tokenizer import Tokenizer, TokenKind
|
||||
from core.utils import strip_tokens, make_unique
|
||||
@@ -245,13 +246,7 @@ class SequenceNodeParser(BaseNodeParser):
|
||||
if token.type == TokenKind.WHITESPACE:
|
||||
return None
|
||||
|
||||
def as_list(a):
|
||||
if a is None:
|
||||
return None
|
||||
|
||||
return a if isinstance(a, list) else [a]
|
||||
|
||||
concepts_by_name = as_list(self.sheerka.fast_resolve(token))
|
||||
concepts_by_name = self.as_list(self.sheerka.fast_resolve(token))
|
||||
concepts_by_first_keyword = new_instances(self.sheerka.get_concepts_by_first_token(token, self._is_eligible))
|
||||
|
||||
if concepts_by_name is None:
|
||||
@@ -299,6 +294,10 @@ class SequenceNodeParser(BaseNodeParser):
|
||||
|
||||
concepts = self.get_concepts(token, self._is_eligible)
|
||||
# self.context.log(f"concepts found for {token=}: {concepts}", who=self.name)
|
||||
|
||||
if not concepts:
|
||||
concepts = self.get_plural(token)
|
||||
|
||||
if not concepts:
|
||||
for concept_parser in concept_parser_helpers:
|
||||
concept_parser.eat_unrecognized(token, pos)
|
||||
@@ -454,3 +453,30 @@ class SequenceNodeParser(BaseNodeParser):
|
||||
self.name,
|
||||
False,
|
||||
context.sheerka.new(BuiltinConcepts.NOT_FOR_ME, body=parser_input.as_text()))
|
||||
|
||||
def get_plural(self, token):
|
||||
if not token.type == TokenKind.IDENTIFIER:
|
||||
return None
|
||||
|
||||
if not token.value.endswith("s"):
|
||||
return None
|
||||
|
||||
concept_name = token.value[:-1] # remove the trailing 's'
|
||||
concepts = self.as_list(self.sheerka.fast_resolve(concept_name))
|
||||
|
||||
if concepts is None:
|
||||
return None
|
||||
|
||||
eligible = [c for c in concepts if self.sheerka.known_plural(c) == NotFound]
|
||||
if not eligible:
|
||||
return None
|
||||
|
||||
return [self.sheerka.new_dynamic(c, BuiltinConcepts.PLURAL, name=token.value, props={BuiltinConcepts.PLURAL: c})
|
||||
for c in concepts]
|
||||
|
||||
@staticmethod
|
||||
def as_list(obj):
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
return obj if isinstance(obj, list) else [obj]
|
||||
|
||||
Reference in New Issue
Block a user