Iは、以下の構造を有するyacc文法の一部(またはむしろjison、が、2つの共有同じ共通基盤)として:Yaccで強制的にシフトするには?
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)
の2番目のケースのため)。このような状況に遭遇した場合、シフトしたいyacc(またはjison)に伝える方法はありますか?
まあ、 '%left'と'%prec'を手にして、本当に問題を解決しました。ありがとう! –
@ B.Alfred '*'にはあいまいさがあります。少なくとも、Zaachのオンラインjisonツールで得られたものです。私はその答えを編集しました。 – rici