省略Happy中的剩余输入(Haskell的解析器生成器)

时间:2014-09-13 23:49:45

标签: haskell happy

根据Pascal语法,程序以点结尾。如果之后有任何事情,Free Pascal(FPC / Lazarus)会忽略其余的字符。

我想要类似的行为。我使用自定义monadic tokenizer并且它很懒,所以我只想在主规则成功时不要调用continuation。

基本上我想像这样somithng:

Program : Header Decls Body '.' SKIP_THE_REMAINING_INPUT { ... }

重要的是,在解析完最后一个点后,根本不会发生任何标记化,因为它可能会导致错误。

1 个答案:

答案 0 :(得分:1)

所以我找到了解决方案。

documentation中描述的Happy中有一个名为部分解析的功能,但我发现它读取了源代码库的git log。它允许解析器丢弃剩余的输入。它使用不同于%name的指令声明:

%name    parser {- normal  parser -}
%partial parser {- partial parser -}

但它的工作方式不符合我的第二个要求:它不应该强制延迟标记器进一步消耗输入。相反,它只需要一个令牌来验证没有更多要解析的内容。

假设!不是有效符号且令牌化程序无法使用它,并考虑以下输入:

  1. begin end. valid_token!!!
  2. begin end.!
  3. 解析(1)成功,因为Happy检查valid_token并停在那里,但解析(2)失败,因为需要另外一个令牌(并且令牌化器无法给它)。

    显然没有办法改变这种行为,因此我的解决方法是通过语法中无处出现的特殊标记来表示词法错误。因此,当tokenizer遇到!(或任何其他无效字符)时,它会产生一个特殊的错误标记。它还应该有助于从词汇错误中恢复。