Fixed first token recognition when creating bnf concepts

This commit is contained in:
2020-05-29 08:52:06 +02:00
parent 479461c0a4
commit c498b394e3
11 changed files with 125 additions and 24 deletions
+3
View File
@@ -348,6 +348,9 @@ class AtomNodeParser(BaseNodeParser):
return valid_parser_helpers
def parse(self, context, parser_input: ParserInput):
if not isinstance(parser_input, ParserInput):
return None
if parser_input.is_empty():
return context.sheerka.ret(
self.name,
+7 -1
View File
@@ -162,11 +162,17 @@ class BaseParser:
if len(self.error_sink) == 1 and isinstance(self.error_sink[0], Concept):
return self.error_sink[0]
if self.has_error:
return sheerka.new(
BuiltinConcepts.ERROR,
body=self.error_sink
)
return sheerka.new(
BuiltinConcepts.PARSER_RESULT,
parser=self,
source=source,
body=self.error_sink if self.has_error else tree,
body=tree,
try_parsed=try_parse)
def get_input_as_text(self, parser_input, custom_switcher=None, tracker=None):
+8 -2
View File
@@ -391,10 +391,11 @@ class StrMatch(Match):
Matches a literal
"""
def __init__(self, to_match, rule_name="", ignore_case=True):
def __init__(self, to_match, rule_name="", ignore_case=True, skip_whitespace=True):
super(Match, self).__init__(rule_name=rule_name)
self.to_match = to_match
self.ignore_case = ignore_case
self.skip_white_space = skip_whitespace
def __repr__(self):
return self.add_rule_name_if_needed(f"'{self.to_match}'")
@@ -415,7 +416,7 @@ class StrMatch(Match):
if m:
node = TerminalNode(self, parser_helper.pos, parser_helper.pos, token.str_value)
parser_helper.next_token()
parser_helper.next_token(self.skip_white_space)
return node
return None
@@ -469,6 +470,8 @@ class BnfNodeFirstTokenVisitor(ParsingExpressionVisitor):
return self.STOP
def visit_StrMatch(self, pe):
if not pe.to_match:
return
self.add_first_token(pe.to_match)
return self.STOP
@@ -947,6 +950,9 @@ class BnfNodeParser(BaseNodeParser):
:return:
"""
if not isinstance(parser_input, ParserInput):
return None
context.log(f"Parsing '{parser_input}' with BnfNode", self.name)
sheerka = context.sheerka
+11
View File
@@ -266,6 +266,17 @@ class BnfParser(BaseParser):
expr.rule_name = concept.name
return self.eat_rule_name_if_needed(expr)
if token.type == TokenKind.STRING:
self.next_token()
tokens = list(Tokenizer(token.strip_quote, yield_eof=False))
if len(tokens) == 1:
return self.eat_rule_name_if_needed(StrMatch(tokens[0].str_value))
else:
elements = [StrMatch(t.str_value, skip_whitespace=False) for t in tokens]
elements[-1].skip_white_space = True
ret = Sequence(*elements)
return self.eat_rule_name_if_needed(ret)
ret = StrMatch(core.utils.strip_quotes(token.value))
self.next_token()
return self.eat_rule_name_if_needed(ret)
+4 -1
View File
@@ -313,7 +313,6 @@ class InFixToPostFix:
"""
return len(self.stack) > 0 and isinstance(self.stack[-1], type)
def _make_source_code_with_concept(self, start, rpar_token, end):
"""
@@ -1068,6 +1067,10 @@ class SyaNodeParser(BaseNodeParser):
:param parser_input:
:return:
"""
if not isinstance(parser_input, ParserInput):
return None
if parser_input.is_empty():
return context.sheerka.ret(
self.name,
-1
View File
@@ -4,7 +4,6 @@ from logging import Logger
import core.utils
from core.concept import Concept
from core.sheerka.services.SheerkaExecute import ParserInput
from sheerkapickle import utils, tags, handlers