这个语法是不明确的,还是图书馆的错?

时间:2018-04-23 16:23:50

标签: parsing grammar context-free-grammar

我使用rust-peg解析表达式语法库,但原则应该是可以理解的。我正在使用该库根据the spec为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语句和表达式语句。表达式可以是x,或x后跟一个块。 if语句是if后跟一个表达式,后跟一个块。这是我的语法无法解析的示例输入:

x {}
if x {

}

这无法解析,因为if语句行中x之后的花括号被解释为块作为"x" sep block规则的一部分,而不是作为if_stmt规则的一部分的块{1}}规则。不幸的是,当这个失败时,这个解析库不会回溯并尝试重新解析该行的这一部分作为if语句的块。我已经意识到,如果我切换expression规则的顺序,以便它首先尝试解析"x",那么if语句解析就好了。这确实会为行x {}带来问题,因为行开头的x只是解析为正常的" x",它之前退出表达式规则它试图解析{}

这些限制会使图书馆无法解析这样的语法吗?我应该找到另一个,还是只写我自己的解析器? (我真的不想这样做)

修改

我尝试了go语法,我发现在if语句条件中放置struct literal("x" sep block示例)是不合法的。因此我能够像attdona所建议的那样消除语法歧义。

1 个答案:

答案 0 :(得分:1)

尝试消除语法歧义:

.

我不知道生锈钉,我希望这可能有助于解决你的语法解析。