gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:32:27 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

所以我找到了解决方案。

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

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

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

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

  1. 开始结束。 valid_token!!!
  2. 开始结束.!

解析 (1) 成功,因为 Happy 检查了 valid_token 并停在那里,但是解析 (2) 失败了,因为还需要一个 token (分词器无法提供)。

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

关于haskell - 省略 Happy 中的剩余输入(Haskell 的解析器生成器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com