为什么不简化解析呢?

时间:2019-09-20 02:18:06

标签: parsing parsimonious

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

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

SELECT 10解析,但是由于某种原因,SELECT A解析失败。我的理解是应该出现object_namealias。我究竟做错了什么?预先感谢。

1 个答案:

答案 0 :(得分:1)

您的语法有两个问题:

  1. 简约不能自动处理空格,您必须照顾好空格(某些想法可以从https://github.com/erikrose/parsimonious/blob/master/parsimonious/grammar.py#L224得出)

  2. 如README.md中所述,/运算符首先匹配匹配项,因此它尝试首先匹配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+"
    """
)

一切都应该正确解析。