我似乎完全无法理解为什么它无法解析。以下是我的简单语法(只是在尝试理解简约,因此语法可能没有意义)。
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_name
或alias
。我究竟做错了什么?预先感谢。
答案 0 :(得分:1)
您的语法有两个问题:
简约不能自动处理空格,您必须照顾好空格(某些想法可以从https://github.com/erikrose/parsimonious/blob/master/parsimonious/grammar.py#L224得出)
如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+"
"""
)
一切都应该正确解析。