所有解析器Text.Parsec.Token礼貌地用于lexeme在令牌之后吃空格.对我来说不幸的是,空格包括新行,我想将它用作表达式终止符.有没有办法说服lexeme新线?
不它不是.这是相关的代码.
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)
Run Code Online (Sandbox Code Playgroud)
人们会注意到where子句中whitespace唯一的选项是处理注释.该lexeme函数使用whitespace并在其余部分中自由使用parsec.token.
对我来说,最终的解决方案是使用合适的词法分析器(alex).Parsec作为一个解析库做得很好,设计可以归结为它可以被修改为词法分析,但是除了小而简单的项目之外,它很快就会变得难以处理.我现在使用alex来创建一组线性标记,然后Parsec将它们变成AST.
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |