Parsing 这是语法含糊不清,还是图书馆的错?
我正在使用解析表达式语法库,但原则应该是可以理解的。我正在使用该库为go基于创建一个解析器。我在解析if语句时遇到了困难,我将问题归结为一个简单的例子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 /
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的含义对任何人来说都应该是清楚的,显然对我来说不是;。我已经更新了答案,看看是否适合你。