假设我定义了一个快乐的语法
%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解析器。我只有在令牌流时才能获得成功 a b b a 要么 B'/ P>
然而,我对失败更感兴趣。我想失败的速度非常快,而且我似乎需要比我想象的更多的令牌。
例如,如果我输入令牌流a,a,a ......它将使第三个a失败。如果我喂b b b,则第三个b失败。为什么额外的预测?匹配f时,一旦我看到两个' a,语法中就没有任何内容可以匹配。