我有以下的野牛语法片段:在野牛,我怎么能保留一个非终端的结合?
binary_op: BINARY_OP { ... } | '|' %prec BINARY_OP { ... } ; non_keyword_expr: non_keyword_expr binary_op non_keyword_expr %prec BINARY_SEND_PREC %dprec 2 { ... } ;
|
在我的语法已经超载的意思,所以我不能只是从我的词法分析器返回它的令牌BINARY_OP。这可能是取决于上下文的不同标记。
如果我用这个作为我的输入:
4 OR 5 OR 6
我可以成功地解析它(或识别为词法分析器BINARY_OP令牌)。
但是,如果我的输入是这样的:
4 | 5 | 6
我得到一个模棱两可的语法错误。 (该|
没有被确认为左结合)
我怎样才能得到binary_op是内non_keyword_expr左结合的?关于binary_op的第二条规则的%prec
声明似乎没有效果。
编辑:这是一个GLR分析器
感谢您的答案。你在说'|'吗?在我的语法中不是终端?混淆为什么它可以正常工作“OR”(令牌BINARY_OP)而不是'|' (隐含的令牌'|')BINARY_OP的关联性似乎成功连接到非终端binary_op ... – nielsbot
@nielsbot:对不起,我不是很清楚。我会编辑我的答案。但有一个问题:你使用GLR解析器吗? (如果是这样,你应该在你的问题中提及它,因为它既不明显也不共同。) – rici
是的,它是GLR。我的意思是补充,但忘了... – nielsbot