中的所有解析器Text.Parsec.Token
礼貌地使用lexeme
吃掉令牌后的空白。对我来说不幸的是,空格包含新行,我想将其用作表达式终止符。有没有办法说服lexeme
留下一条新线?
不它不是。这是相关代码。
From 文本.Parsec.Token http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/src/Text-Parsec-Token.html#GenTokenParser:
lexeme p
= do{ x <- p; whiteSpace; return x }
--whiteSpace
whiteSpace
| noLine && noMulti = skipMany (simpleSpace <?> "")
| noLine = skipMany (simpleSpace <|> multiLineComment <?> "")
| noMulti = skipMany (simpleSpace <|> oneLineComment <?> "")
| otherwise = skipMany (simpleSpace <|> oneLineComment <|> multiLineComment <?> "")
where
noLine = null (commentLine languageDef)
noMulti = null (commentStart languageDef)
人们会注意到在 where 子句中whitespace
唯一的选择就是处理评论。这lexeme
功能用途whitespace
并且它在其余部分中被广泛使用parsec.token
.
2015 年 9 月 28 日更新
对我来说最终的解决方案是使用适当的词法分析器(alex https://www.haskell.org/alex/)。 Parsec 作为一个解析库做得非常好,它的设计值得称赞,它可以被用来进行词法分析,但对于除小而简单的项目之外的所有项目,它很快就会变得笨拙。我现在使用 alex 创建一组线性标记,然后 Parsec 将它们转换为 AST。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)