Parsing 这是语法含糊不清,还是图书馆的错?

Parsing 这是语法含糊不清,还是图书馆的错?,parsing,grammar,context-free-grammar,Parsing,Grammar,Context Free Grammar,我正在使用解析表达式语法库,但原则应该是可以理解的。我正在使用该库为go基于创建一个解析器。我在解析if语句时遇到了困难,我将问题归结为一个简单的例子 sep = ( " " / "\n" )* expression = "x" sep block / "x" if_stmt = "if" sep expression sep block block = "{" ( sep stmt )* "}" stmt = if_stmt /

我正在使用解析表达式语法库,但原则应该是可以理解的。我正在使用该库为go基于创建一个解析器。我在解析if语句时遇到了困难,我将问题归结为一个简单的例子

sep
    = ( " " / "\n" )*

expression
    = "x" sep block
    / "x"

if_stmt
    = "if" sep expression sep block

block
    = "{" ( sep stmt )* "}"

stmt
    = if_stmt
    / expression

pub file
    = ( sep stmt )*
在我看来,这种语法应该解析一种非常简单的语言,它包含两种类型的语句:If语句和expression语句。表达式可以是x,也可以是x后跟块。if语句后面跟一个表达式,后面跟一个块。以下是我的语法无法解析的输入示例:

x {}
if x {

}
这无法分析,因为if语句行中x后面的大括号被解释为x sep块规则的一部分,而不是if_stmt规则的一部分。不幸的是,此解析库不会回溯并尝试在失败时将这部分行作为if语句的块重新解析。我已经意识到,如果我切换表达式规则的顺序,以便它首先尝试解析x,那么if语句解析得很好。这确实给行x{}带来了问题,因为行开头的x解析为普通的x,并且在尝试解析{}之前退出了表达式规则

这些限制是否使库无法解析这样的语法?我应该找另一个解析器,还是只编写自己的解析器?我真的不想那样做

编辑
我尝试了go语法,发现将x sep块示例的结构文本放在if语句条件下是不合法的。因此,我能够按照阿特多纳的建议消除语法歧义。

尝试消除语法歧义:

simple_expr
    = "x"

block_expr
    = "x" sep block

expression
    = simple_expr
    / block_expr

if_stmt
    = "if" sep simple_expr sep block

我不知道rust peg,我希望这可能有助于解决语法分析问题。

谢谢,但它的语义不同。如果后面不应该跟一个block_expr,那么后面应该跟一个表达式,然后是block。if后面的块不是表达式的一部分,它是if.if的一部分。if的含义对任何人来说都应该是清楚的,显然对我来说不是;。我已经更新了答案,看看是否适合你。