Fixed #29: Parsers: Implement parsing memoization

Fixed #77 : Parser: ShortTermMemoryParser should be called separately
Fixed #78 : Remove VariableNode usage
Fixed #79 : ConceptManager: Implement compile caching
Fixed #80 : SheerkaExecute : parsers_key is not correctly computed
Fixed #81 : ValidateConceptEvaluator : Validate concept's where and pre clauses right after the parsing
Fixed #82 : SheerkaIsAManager: isa() failed when the set as a body
Fixed #83 : ValidateConceptEvaluator : Support BNF and SYA Concepts
Fixed #84 : ExpressionParser: Implement the parser as a standard parser
Fixed #85 : Services: Give order to services
Fixed #86 : cannot manage smart_get_attr(the short, color)
This commit is contained in:
2021-06-07 21:14:03 +02:00
parent 1059ce25c5
commit 7dcaa9c111
92 changed files with 4263 additions and 1890 deletions
@@ -14,7 +14,7 @@ from core.builtin_helpers import ensure_concept, ensure_bnf
from core.concept import Concept, DEFINITION_TYPE_DEF, DEFINITION_TYPE_BNF, freeze_concept_attrs, ConceptMetadata, \
VARIABLE_PREFIX
from core.global_symbols import EVENT_CONCEPT_CREATED, NotInit, NotFound, ErrorObj, EVENT_CONCEPT_DELETED, NoFirstToken, \
EVENT_CONCEPT_MODIFIED
EVENT_CONCEPT_MODIFIED, CONCEPT_COMPARISON_CONTEXT
from core.sheerka.services.sheerka_service import BaseService
from core.tokenizer import Tokenizer, TokenKind
from parsers.BnfNodeParser import RegExDef
@@ -132,6 +132,7 @@ class SheerkaConceptManager(BaseService):
self.sheerka.bind_service_method(self.get_concepts_by_first_regex, False, visible=False)
self.sheerka.bind_service_method(self.get_concepts_bnf_definitions, False, visible=False)
self.sheerka.bind_service_method(self.clear_bnf_definition, True, visible=False)
self.sheerka.bind_service_method(self.set_precedence, True)
register_concept_cache = self.sheerka.om.register_concept_cache
@@ -194,7 +195,7 @@ class SheerkaConceptManager(BaseService):
if key in BuiltinUnique:
concept.get_metadata().is_unique = True
concept.get_metadata().is_evaluated = True
concept.get_hints().is_evaluated = True
from_db = self.sheerka.om.get(self.CONCEPTS_BY_KEY_ENTRY, concept.get_metadata().key)
if from_db is NotFound:
@@ -728,6 +729,39 @@ class SheerkaConceptManager(BaseService):
else:
self.sheerka.om.clear(self.CONCEPTS_BNF_DEFINITIONS_ENTRY)
def set_precedence(self, context, *concepts):
"""
Set the precedence order when parsing concept with SyaNodeParser
The first concept in the list have the highest priority
:param context:
:param concepts:
:return:
"""
if len(concepts) < 2:
return self.sheerka.err("Not enough elements")
as_iterable = iter(concepts)
first = next(as_iterable)
ensure_concept(first)
try:
while True:
second = next(as_iterable)
ret = self.sheerka.set_is_greater_than(context,
BuiltinConcepts.PRECEDENCE,
first,
second,
CONCEPT_COMPARISON_CONTEXT)
if not ret.status:
return ret
first = second
except StopIteration:
pass
return self.sheerka.new(BuiltinConcepts.SUCCESS)
@staticmethod
def _name_has_changed(to_add):
if to_add is None or "meta" not in to_add:
@@ -821,7 +855,7 @@ class SheerkaConceptManager(BaseService):
concept.get_metadata().key = None
if self._definition_has_changed(to_add) and concept.get_metadata().definition_type == DEFINITION_TYPE_BNF:
concept.set_bnf(None)
ensure_bnf(context, concept, update_bnf_for_cached_concept=False)
ensure_bnf(context, concept)
concept.init_key()