如何在 Parsec 中定义多种类型的注释块

发布于 2024-12-19 16:31:47 字数 476 浏览 1 评论 0原文

我正在尝试学习如何使用 Parsec 编写 Delphi 解析器,但我在定义 LanguageDef 时陷入困境。

在Delphi中,有两种类型的注释块,(* comments *){comments }。 但是commentStart & 的类型LanguageDef 的 commentEnd 是 String,而不是 [String],所以我只能输入其中之一。

因此,我尝试制作自己的空白解析器,但我不确定是否真的可以将其传递到 makeTokenParser 中。

任何帮助将不胜感激。

感谢


John 和 Chris 帮助我理解并解决了这个问题,但解决方案涉及替换 makeTokenParser 提供的大量解析器,因此这并不完全可取。

如果我能找到更好的解决方案,我会再次发帖。

I am trying to learn how to use Parsec to write a Delphi parser, but I am getting stuck at defining the LanguageDef.

In Delphi, there are two types of comment blocks, (* comments *) and { comments }.
But the types of commentStart & commentEnd of LanguageDef are String, not [String], so I could only put in one or the other.

So, I tried to make my own whiteSpace parser, but I'm not sure I could actually pass it into makeTokenParser.

Any help would be appreciated.

Thanks


John and Chris have helped me to understand and get around the problem, but the solution involves replacing a huge number of parsers that makeTokenParser provides, so it's not exactly desirable.

I will post again if I could find a better solution.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

话少情深 2024-12-26 16:31:47

我对 Text.ParserCombinators.Parsec.Language 文件的解读是,这不能直接使用 LanguageDef 来完成。

我相信您编写自己的 whiteSpace 解析器的方向是正确的。为了成功使用它,您需要覆盖由 makeTokenParser 生成的 whiteSpace 解析器。由 makeTokenParser 创建的 TokenParser 是一个记录,每个字段都包含一个解析器。我们可以创建记录的新副本,并替换其中一个字段,如下所示:

-- ask GCHi for the type actual type signature constraints
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
  originalTokenParser {whiteSpace = myWhiteSpaceParser}

My reading of the Text.ParserCombinators.Parsec.Language file is that this cannot be done directly using a LanguageDef.

I believe you are on the right track to write your own whiteSpace parser. In order to use it successfully, you need to overwrite the whiteSpace parser that is generated by makeTokenParser. The TokenParser created by makeTokenParser is a record with each field containing a parser. We can create a new copy of the record with one of those fields replaced as follows:

-- ask GCHi for the type actual type signature constraints
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
  originalTokenParser {whiteSpace = myWhiteSpaceParser}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文