假设我定义了一个快乐的语法
%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 ... 到第三个 a 失败。如果我喂 bbb,则需要第三个 b 才能失败。为什么要额外的前瞻?匹配 f 时,一旦我看到两个 'a',语法中就没有什么可以匹配的了。