我使用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所建议的那样消除语法歧义。
答案 0 :(得分:1)
尝试消除语法歧义:
.
我不知道生锈钉,我希望这可能有助于解决你的语法解析。