Whitespace 光年解析器以意外的方式运行

Whitespace 光年解析器以意外的方式运行,whitespace,idris,parser-combinators,lightyear,Whitespace,Idris,Parser Combinators,Lightyear,我正在尝试用光年为Idris构建格式化程序。 到目前为止,整个计划如下: 现在,目的是标记文件本身,然后漂亮地打印它,也就是说,作为输入的文件应该是一个固定点 问题出现在每个字符串文本之后,我的解析器似乎会吃掉空白。如果我在一个字符串文本后立即放置除空格以外的任何内容,它将解析该字符以及下面的所有空格 此示例程序将显示错误: main2 : IO () main2 = putStrLn $ str where str = case parse tokenParser "\"

我正在尝试用光年为Idris构建格式化程序。 到目前为止,整个计划如下:

现在,目的是标记文件本身,然后漂亮地打印它,也就是说,作为输入的文件应该是一个固定点

问题出现在每个字符串文本之后,我的解析器似乎会吃掉空白。如果我在一个字符串文本后立即放置除空格以外的任何内容,它将解析该字符以及下面的所有空格

此示例程序将显示错误:

main2 : IO ()
main2 = putStrLn $ str
    where
      str = case parse tokenParser "\"IdrisFMT.idr\" \n" of
                 (Left l) => "failed" ++ show l
                 (Right r) => show $ map (show @{default}) r
这将打印出:

*IdrisFMT> :exec main2
["StringLiteral(\"IdrisFMT.idr\")"]
如果我将正在分析的字符串更改为
“\”IdrisFMT.idr\“c\n”
,我会得到:

*IdrisFMT> :exec main2
["StringLiteral(\"IdrisFMT.idr\")", "Identifier(c)", "' '", "'\\n'"]
这正是我所期望的

我相信错误是由我解析字符串文本的方式引起的,但是我无法理解我的错误,并且我很难找到调试光年解析器的好方法。 我的字符串文字解析器的实现如下所示:

escape : Parser String
escape = do
  d <- char '\\'
  c <- oneOf "\\\"0nrvtbf"
  pure $ pack $ (the $ List Char) [d,c]

nonEscape : Parser String
nonEscape = map (\x => pack $ (the $ List _) [x]) $ noneOf "\\\"\0\n\r\v\t\b\f"

character : Parser String
character = nonEscape <|>| escape

stringLiteralToken : Parser Token
stringLiteralToken = map (StringLiteral . concat) $ dquote (many character)
escape:解析器字符串
逃逸
d在#idris频道聊天后,我了解到大多数内置的高阶解析器(例如,
dquote
)都会在结尾跳过空格。 对我来说,这不是我想要的。相反,我使用了
between
函数,它接受3个参数,一个用于何时开始的解析器,另一个用于何时停止,第三个用于中间的任何参数

要分析字符串文字,我现在执行以下操作:

escape : Parser String
escape = do
  d <- char '\\'
  c <- oneOf "\\\"0nrvtbf'"
  pure $ pack $ (the $ List Char) [d,c]

nonEscape : Parser String
nonEscape = map (\x => pack $ (the $ List _) [x]) $ noneOf "\\\"\0\n\r\v\t\b\f"

character : Parser String
character = nonEscape <|>| escape

stringLiteralToken : Parser Token
stringLiteralToken = map (StringLiteral . concat) $ (between (char '"') (char '"')) (many character)
escape:解析器字符串
逃逸

d您在github存储库中提供的代码似乎正常工作。它不会消耗文字后面的空白。我建议您添加一个简短的答案,描述您为解决问题所做的工作。