Fixed first token recognition when creating bnf concepts
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user