【问题标题】:Omit the remaining input in Happy (parser generator for Haskell)省略 Happy 中的剩余输入(Haskell 的解析器生成器)
【发布时间】:2014-09-13 23:49:44
【问题描述】:

根据 Pascal 语法,程序以点结束。如果后面有任何内容,Free Pascal (FPC/Lazarus) 会省略剩余的字符。

我想要类似的行为。我使用了一个自定义的 monadic 分词器,它很懒惰,所以我只是希望 Happy 在主规则成功时不要调用延续。

基本上我想要这样的东西:

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

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

【问题讨论】:

    标签: haskell happy


    【解决方案1】:

    所以我找到了解决方案。

    Happy 中有一个名为 partial parsing 的功能,在 documentation 中进行了描述,尽管我在阅读源存储库的 git log 时发现了它。它允许解析器丢弃剩余的输入。它是使用不同于%name 的指令声明的:

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

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

    假设! 不是一个有效的符号并且分词器无法使用它,并考虑以下输入:

    1. begin end. valid_token!!!
    2. begin end.!

    解析 (1) 成功,因为 Happy 检查了 valid_token 并停在那里,但解析 (2) 失败,因为还需要一个令牌(并且令牌生成器无法提供它)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多