Bison 如何在Yacc中强制转换?

Bison 如何在Yacc中强制转换?,bison,yacc,jison,Bison,Yacc,Jison,我将以下构造作为yacc语法的一部分(或者更确切地说是jison,但两者共享相同的公共基础): 这当然是一个简化的例子,但它应该给出总体思路并说明实际问题。我想分别将Foo[],Foo*,Foo*[]等结构解析为(Foo)[],(Foo)*,((Foo)*)[ 然而,Yacc有理由抱怨,当遇到以下构造时,它不知道该怎么办: func (A, B) => C[] 它可以被解析为func(A,B)=>(C[])或(func(A,B)=>C)[。我当然希望它是第一个(因为我有一个(Type)构

我将以下构造作为yacc语法的一部分(或者更确切地说是jison,但两者共享相同的公共基础):

这当然是一个简化的例子,但它应该给出总体思路并说明实际问题。我想分别将
Foo[]
Foo*
Foo*[]
等结构解析为
(Foo)[]
(Foo)*
((Foo)*)[

然而,Yacc有理由抱怨,当遇到以下构造时,它不知道该怎么办:

func (A, B) => C[]

它可以被解析为
func(A,B)=>(C[])
(func(A,B)=>C)[
。我当然希望它是第一个(因为我有一个
(Type)
构造用于第二个案例)。如果yacc(或jison)遇到这种情况,我有什么办法可以告诉它我想改变吗?

给最后一个
类型
产品一个优先级,可以使用
%prec
声明和伪终端,也可以使用默认值,即最后一个终端的优先级。然后确保
[
标记的优先级更高。(您还必须使
*
的优先级高于
=>
,以解决其他移位减少冲突。)

还有其他解决方案,但那是最简单的


事实上,bison/yacc/jison/etc.总是喜欢在shift-reduce冲突中使用shift,因此您不需要做任何事情来获得shift。优先级规则将抑制警告,但您也可以使用
expect
声明来实现这一点。

是的,摆弄
%left
%prec
确实解决了问题。谢谢!@B.Alfred,
*
还有一个模棱两可的地方,或者至少这是我从Zaach的在线jison工具中得到的。我编辑了答案,将其包括在内。
func (A, B) => C[]