0

这是我的 y 文件的示例。

| rval '<' rval
| rval '<' '<' rval
| rval '>' rval
| rval '>' '>' rval

| rval LSHIFT rval
| rval RSHIFT rval

我想让 << 和 >> 像 << 和 >> 一样工作。我认为他们会很困难,但发现“上下文相关的优先级” http://www.gnu.org/software/bison/manual/html_node/Contextual-Precedence.html

但是它似乎不起作用。写作 | rval '<' '<' rval %prec LSHIFT

似乎什么都不做。我试着把它放在这里 * = "%prec LSHIFT" 除了我一次只有一个

| * rval * '<' * '<' * rval  *

每个插槽似乎都不起作用。我没有注意到任何警告,除非我在规则中有多个 %prec LSHIFT。

如何让野牛将 > > 和 << 视为 >> 和 <<。注意:我不能在词法分析器中制作 rshift >\s*> 因为这会干扰其他事情

4

1 回答 1

2

您不能在解析器中执行此操作(没有%glr-parser),因为它需要两个前瞻标记。问题是“优先规则”并没有真正进行优先解决。它们只是解决转移/减少冲突的一种技巧,有利于一个令牌而不是另一个令牌。在这种情况下,相关的比较是在左边rval的标记和'<''>'标记之间。解析器需要比较这些以确定是否减少“内部”的任何规则rval,或者是否转移。没有更多的前瞻,它不知道'<'后面是另一个'<'还是其他东西。

于 2013-03-30T19:36:11.893 回答