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

ePa*_*Pak 12 delphi haskell parsec

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

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

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

任何帮助,将不胜感激.

谢谢


约翰和克里斯都帮助我了解和解决问题搞定了,但解决的办法包括更换该解析器的大量makeTokenParser提供,所以它不是完全不可取的.

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

Joh*_*ler 5

我对该Text.ParserCombinators.Parsec.Language文件的阅读是不能直接使用a来完成的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}
Run Code Online (Sandbox Code Playgroud)