幸せな文法を定義するとします
%name pf f
%tokentype { AB }
%error { parseError }
%token
a { A }
b { B }
%%
f :
a g a {}
| b {}
g :
b b {}
{
data AB = A | B deriving (Eq,Ord,Show)
parseError _ = error " bad "
}
これをコンパイルすると
happy --glr
私は一般的に、自明でないあいまいさを持つ文法に興味があります。ただし、この例は、私を混乱させているビットを示しています。
Haskell パーサーを取得します。トークン ストリームが abba または b の場合にのみ成功します
しかし、私は失敗にもっと興味があります。私は非常に早く失敗したいと思っており、必要と思われるよりも多くのトークンが必要なようです。
たとえば、トークン ストリーム a,a,a をフィードすると、失敗するのに 3 番目の a が必要です。bbb をフィードすると、失敗するのに 3 番目の b までかかります。余分な先読みはなぜですか?f を一致させるとき、2 つの 'a' が表示されると、一致する文法はありません。