We can now use concept sets in BNF definitions

This commit is contained in:
2020-01-19 21:48:43 +01:00
parent a7b239c167
commit 821614a6c4
16 changed files with 643 additions and 93 deletions
+23 -15
View File
@@ -127,15 +127,12 @@ class BnfParser(BaseParser):
except LexerError as e:
self.add_error(e, False)
value = self.get_return_value_body(context.sheerka, self.source, tree, tree)
ret = self.sheerka.ret(
self.name,
not self.has_error,
self.sheerka.new(
BuiltinConcepts.PARSER_RESULT,
parser=self,
source=self.source,
body=self.error_sink if self.has_error else tree,
try_parsed=tree))
value)
return ret
@@ -231,15 +228,26 @@ class BnfParser(BaseParser):
if token.type == TokenKind.IDENTIFIER:
self.next_token()
return ConceptExpression(token.value)
# concept = self.sheerka.get(str(token.value))
# if hasattr(concept, "__iter__") or self.sheerka.isinstance(concept, BuiltinConcepts.UNKNOWN_CONCEPT):
# self.add_error(CannotResolveConceptNode(str(token.value)))
# self.next_token()
# return None
# else:
# self.next_token()
# return concept
concept_name = str(token.value)
# we are trying to match against a concept which is still under construction !
# (for example of recursive bnf definition)
if self.context.obj and hasattr(self.context.obj, "name"):
if concept_name == str(self.context.obj.name):
return ConceptExpression(concept_name)
concept = self.context.get_concept(concept_name)
if not self.sheerka.is_known(concept):
self.add_error(concept)
return None
elif hasattr(concept, "__iter__"):
self.add_error(
self.sheerka.new(BuiltinConcepts.CANNOT_RESOLVE_CONCEPT,
body=("key", concept_name)))
return None
else:
return concept
ret = StrMatch(core.utils.strip_quotes(token.value))
self.next_token()