如何在 Parsec 中定义多种类型的注释块
我正在尝试学习如何使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我对 Text.ParserCombinators.Parsec.Language 文件的解读是,这不能直接使用 LanguageDef 来完成。
我相信您编写自己的
whiteSpace
解析器的方向是正确的。为了成功使用它,您需要覆盖由makeTokenParser
生成的whiteSpace
解析器。由makeTokenParser
创建的TokenParser
是一个记录,每个字段都包含一个解析器。我们可以创建记录的新副本,并替换其中一个字段,如下所示:My reading of the
Text.ParserCombinators.Parsec.Language
file is that this cannot be done directly using aLanguageDef
.I believe you are on the right track to write your own
whiteSpace
parser. In order to use it successfully, you need to overwrite thewhiteSpace
parser that is generated bymakeTokenParser
. TheTokenParser
created bymakeTokenParser
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: