0

这是我的 bnf 语法的一部分。

//this works
<ter-stmnt>     ::= <rval> '?' <rval> ':' <rval>
//this gets an error
<ter-stmnt>     ::= <bool-val> '?' <rval> ':' <rval>
<bool-val>      ::= <rval>

这看起来很疯狂,第二个不应该与第一个完全相同吗?我在阅读时更喜欢第二个 bc,我发现我期望一个 bool 值与通用的 rval 相反,这可能意味着任何事情。

我正在使用黄金解析器 3.4.4

4

2 回答 2

2

你得到的错误是:

减少-减少冲突
'?' 可以遵循多个已完成的规则​​。Reduce-Reduce 错误是在语法允许同时减少两个或多个规则时导致的,因为相同的标记。语法模棱两可。请参阅文档以获取更多信息。

就是说在对一些token求值后,无法判断是只读了a<bool-val>还是读了an <rval>

为了更有意义,你的语法应该<bool-val>明确地说 a 是什么,然后说 an <rval>is a<bool-val>或其他东西。

这是另一个减少/减少错误的例子这里是 GOLD 文档。Gold 会尝试隐藏(即发出警告而不是错误)关于 shift/reduce 的信息,但它会将 reduce/reduce 视为错误。

我不完全理解这一点;我是解析新手。也许您对这是出乎意料的行为是正确的?然而,GOLD 邮件列表目前似乎已关闭,可能是因为它已被审核并且 Devin 已经离线数月了。

于 2009-08-05T13:51:04.013 回答
0

你得到什么错误?你能包括你的整个语法文件吗?如果我声明诸如...之类的规则,我不会收到任何错误

<ter-stmnt>     ::= <bool-val> '?' <rval> ':' <rval>
<bool-val>      ::= <rval>
<rval>  ::= '!'
于 2009-08-03T05:42:00.000 回答