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:
2021-08-05 19:07:21 +02:00
parent c798c2c570
commit 71d1b1d1ca
31 changed files with 600 additions and 105 deletions
+33 -7
View File
@@ -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]