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

时间:2011-12-05 11:01:36

标签: delphi haskell parsec

我正在尝试学习如何使用Parsec来编写Delphi解析器,但我很难定义LanguageDef。

在Delphi中,有两种类型的注释块,(* comments *){ comments }。 但评论的类型开始& LanguageDef的commentEnd是String,而不是[String],所以我只能放入一个或另一个。

所以,我尝试制作自己的whiteSpace解析器,但我不确定我是否真的可以将其传递给makeTokenParser

任何帮助都将不胜感激。

由于


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

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

1 个答案:

答案 0 :(得分:5)

我对Text.ParserCombinators.Parsec.Language文件的解读是,无法使用LanguageDef直接完成此操作。

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

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