1

幸せな文法を定義するとします

%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' が表示されると、一致する文法はありません。

4

0 に答える 0