1

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

Type
    : IDENT
    | Type "[" "]"
    | Type "*"
    | "func" "(" Types ")" "=>" Type
    ;

Types
    : /* No arguments */
    | Type /* Single argument */
    | Types "," Type /* Multiple arguments */
    ;

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

然而,Yacc 正确地抱怨它在遇到以下构造时不知道该怎么做:

func (A, B) => C[]

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

4

1 回答 1

1

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

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

其实就是bison/yacc/jison/等。总是更喜欢在班次减少冲突中班次,所以你不需要做任何事情来获得班次。优先规则将抑制警告,但您也可以使用expect声明来执行此操作。

于 2017-02-10T19:37:04.583 回答