Почему скупой не разбирает это? - PullRequest
0 голосов
/ 20 сентября 2019

Кажется, я полностью застрял в понимании, почему это не удается разобрать.Ниже приведена моя простая грамматика (просто пытаюсь понять скупость и, следовательно, грамматика может не иметь смысла).

from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor

sql_grammar = Grammar(
    """
    select_statement     = "SELECT" ("ALL" / "DISTINCT")? object_alias_section
    object_alias_section = object_name / alias
    object_name          = ~"[ 0-9]*"
    alias                = ~"[ A-Z]*"
    """
)


data = """SELECT A"""


tree = sql_grammar.parse(data)
print("tree:", tree, "\n")

A SELECT 10 парсит, но по какой-то причине SELECT A не удается разобрать.Я понимаю, что или 1006 * или alias должны присутствовать.Что я делаю неправильно?Заранее спасибо.

1 Ответ

1 голос
/ 25 сентября 2019

Есть две проблемы с вашим грамматиком:

  1. Parsimonious не обрабатывает пробелы автоматически, вы должны позаботиться о них (некоторые идеи могут быть получены из https://github.com/erikrose/parsimonious/blob/master/parsimonious/grammar.py#L224)

  2. Как указано в README.md * оператор 1009 * сопоставляет первые подходящие альтернативы, поэтому сначала попытается сопоставить object_name. Так как существует неподтвержденный пробел, он сопоставляется object_name и завершается синтаксический анализ.Но даже если пространство будет обрабатываться правильно, object_name будет соответствовать пустой строке, и синтаксический анализ также завершится с ошибкой.

Чтобы исправить вашу грамматику, я предлагаю изменить ее следующим образом:

sql_grammar = Grammar(
    """
    select_statement     = "SELECT" (ws ("ALL" / "DISTINCT"))? ws object_alias_section
    object_alias_section = object_name / alias
    object_name          = ~"[ 0-9]+"
    alias                = ~"[ A-Z]+"
    ws                   = ~"\s+"
    """
)

и все должно правильно анализироваться.

...