以下是我y文件的示例。
| rval '<' rval
| rval '<' '<' rval
| rval '>' rval
| rval '>' '>' rval
| rval LSHIFT rval
| rval RSHIFT rval
我想允许&lt; &LT;和&gt; &GT;像&lt;&lt;一样工作和&gt;&gt;。我认为他们很难,但发现“依赖于上下文的优先权” http://www.gnu.org/software/bison/manual/html_node/Contextual-Precedence.html
然而它似乎没有用。写作 | rval'&lt;' '&LT;' rval%prec LSHIFT
似乎什么都不做。我试着将它放在* =“%prec LSHIFT”,除了我一次只有一个
| * rval * '<' * '<' * rval *
每个插槽似乎都不起作用。我没有注意到任何警告,除非我在规则中有超过一%的预先LSHIFT。
我如何获得野牛治疗&gt; &GT;和&lt;&lt; as&gt;&gt;和&lt;&lt;注意:我无法制作rshift&gt; \ s *&gt;在词法分析器中,因为这会干扰其他事情
答案 0 :(得分:2)
你不能在解析器中执行此操作(没有%glr-parser
),因为它需要两个前瞻标记。问题是“优先规则”并没有真正做到优先解决。他们只是一个解决转移/减少冲突的黑客,而不是另一个令牌。在这种情况下,相关比较是在左rval
内的令牌与'<'
或'>'
令牌之间。解析器需要比较这些以确定是否减少rval
“内部”或者是否移位的规则。没有更多的预测,它不知道'<'
是否后跟另一个'<'
或其他内容。