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

4

0 回答 0