我有以下结构作为 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)我想换班吗?