3

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

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

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

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

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

4

1 回答 1

1

所以我找到了解决方案。

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

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

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

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

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

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

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

于 2014-09-14T14:38:28.443 回答