Haskell Parsec无法识别块注释

Haskell Parsec无法识别块注释,haskell,mustache,parsec,Haskell,Mustache,Parsec,解析胡须模板时,我在Parsec识别注释时遇到问题。 各种小胡子标签都以{{开头,包括块注释({{!comment}})。 我已经在我的令牌解析器中将commentStart和commentEnd设置为{{!和}。 每当我向模板添加注释时,Parsec都会抱怨该注释是意外的。 它需要一个mustache变量,因为这是唯一匹配{{的标记 Parsec什么时候删除注释?我想它会在源代码到达我的解析器之前发生?Parsec不会删除注释。在TokenParser中,注释包含在空白处,因此 whiteSp

解析胡须模板时,我在Parsec识别注释时遇到问题。
各种小胡子标签都以
{{
开头,包括块注释(
{{!comment}}
)。 我已经在我的令牌解析器中将commentStart和commentEnd设置为
{{!
}

每当我向模板添加注释时,Parsec都会抱怨该注释是意外的。
它需要一个mustache变量,因为这是唯一匹配
{{
的标记


Parsec什么时候删除注释?我想它会在源代码到达我的解析器之前发生?

Parsec不会删除注释。在
TokenParser
中,注释包含在空白处,因此

whiteSpace tokenParser
跳过注释和普通空白(空白、制表符、换行符等)

通常,您使用
lexeme parser
跳过词素后面的所有空格,然后顶级解析器只需跳过一次初始空格,就可以跳过源代码中的任何前导空格,之后,所有空格(包括注释)都会自动处理(由
makeTokenParser
创建的
TokenParser
创建)


如果不使用
词素
并手动处理空白,则必须注意作为注释分隔符前缀的标记/词素。如果先尝试前缀,则会成功,但只使用部分注释分隔符,在这种情况下,将
“!”
留给变量解析器,而变量解析器随后会失败。

是否可以选择给我们看一下解析代码的相关部分?您可能有兴趣查看我在
mustache2hs
包中的mustache的Parsec解析器。mustache2hs是一个非常酷的想法!我看了一下,它可以从一些模块化中获益:-).我的解析器构建了一个XML/mustache AST来做一些DOM的事情,所以你的解析器并不真正适用于我的情况(反正它已经编码好了…)哦,当然!我有一些“重要的空白”的东西,这就是为什么我经常只使用Char.string解析器的原因。当我在XML属性之间添加注释时(我使用lexeme解析器)它实际上是有效的。谢谢!这也是一个解决Parsec问题的方法,在这个问题中,输入开头的注释或空格不会被忽略。