这是我的bnf语法的一部分。
//this works
<ter-stmnt> ::= <rval> '?' <rval> ':' <rval>
//this gets an error
<ter-stmnt> ::= <bool-val> '?' <rval> ':' <rval>
<bool-val> ::= <rval>
这看起来很疯狂,不应该第二次与第一次完全一样吗?我更喜欢阅读时的第二个bc,我看到我希望bool值与通用rval相反,这可能意味着什么。
我正在使用Gold Parser 3.4.4
答案 0 :(得分:2)
您收到的错误是:
减少 - 减少冲突
'?'可以遵循多个已完成的规则。当语法允许同时减少两个或更多规则时,对于相同的令牌,会导致Reduce-Reduce错误。语法是暧昧的。有关更多信息,请参阅文档。
它说在评估了一些令牌之后,它无法确定它是仅读取<bool-val>
还是读取<rval>
。
为了更有意义,你的语法应该说<bool-val>
是什么,具体而言,然后说<rval>
是<bool-val>
或其他东西。
这是另一个example of a reduce/reduce error和here's the GOLD documentation。 Gold会尝试隐藏(即发出警告而不是错误)关于shift / reduce,但它会将reduce / reduce视为错误。
我不完全理解这一点;我是解析的新手。也许你对这是出乎意料的行为是正确的吗?然而,GOLD邮件列表目前似乎有所下降,可能是因为它已经放缓并且Devin已经离线数月。
答案 1 :(得分:0)
你得到什么错误?你能包含你的整个语法文件吗?如果我宣布像...这样的规则,我不会收到任何错误。
<ter-stmnt> ::= <bool-val> '?' <rval> ':' <rval>
<bool-val> ::= <rval>
<rval> ::= '!'