在Parsec,有没有办法防止lexeme消费换行?

Joh*_*ler 13 haskell parsec

所有解析器Text.Parsec.Token礼貌地用于lexeme在令牌之后吃空格.对我来说不幸的是,空格包括新行,我想将它用作表达式终止符.有没有办法说服lexeme新线?

Joh*_*ler 6

不它不是.这是相关的代码.

来自Text.Parsec.Token:

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.


2015年9月28日更新

对我来说,最终的解决方案是使用合适的词法分析器(alex).Parsec作为一个解析库做得很好,设计可以归结为它可以被修改为词法分析,但是除了小而简单的项目之外,它很快就会变得难以处理.我现在使用alex来创建一组线性标记,然后Parsec将它们变成AST.