1

我似乎完全无法理解为什么无法解析。以下是我的简单语法(只是试图理解简约,因此语法可能没有意义)。

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")

ASELECT 10解析但由于某种原因,aSELECT A无法解析。我的理解要么存在,object_name要么alias应该存在。我究竟做错了什么?提前致谢。

4

1 回答 1

4

你的语法有两个问题:

  1. Parsimonious 不会自动处理空格,你必须照顾它们(一些想法可以来自https://github.com/erikrose/parsimonious/blob/master/parsimonious/grammar.py#L224

  2. 如 README.md中所述,/运算符匹配第一个匹配的替代项,因此它尝试首先匹配object_name。因为有悬空未解析的空间,所以是 match byobject_name和 parsingfinish。但是即使正确处理了空间,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+"
    """
)

一切都应该正确解析。

于 2019-09-25T01:30:58.057 回答