12

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

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

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

任何帮助,将不胜感激。

谢谢


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

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

4

1 回答 1

5

我对该Text.ParserCombinators.Parsec.Language文件的阅读是,这不能直接使用LanguageDef.

我相信您在编写自己的whiteSpace解析器方面是正确的。为了成功使用它,您需要覆盖whiteSpacemakeTokenParser. 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}
于 2011-12-05T18:26:24.847 回答