这是迄今为止我的代码:http://hpaste.org/86353 。我正在 Windows 上使用 GHC 进行构建。
上面的代码在我的测试文件上生成以下输出:
parse error at (line 3, column 5):
unexpected " "
expecting "{", "if" or identifier
这是我的测试输入:
{ if 9 < 3 then
{
a(); b() c()
d()
}else if 2 < 1{if 3 > 2 { }}}
我一直无法找出为什么表达式后面的空格使秒差距如此令人沮丧。如果我删除 a() 或 b() 之后的分号,那么 parsec 将提示下一次调用的第一个字母(即:b 或 c)。如果我重新添加分号,parsec 会提示空格。任何调用之间没有空格,a() 和 b() 后面有分号,但 c() 后面没有分号会导致程序正确解析。相同的测试,除了 c() 后面的分号导致“意外的\n”。
有什么提示吗?
最佳答案
主要问题是您希望换行符起作用,但您的词法分析器将它们视为空格。这意味着所有换行符在每个标记之后都会被静默消耗。不幸的是,没有简单的方法可以解决这个问题:In Parsec, is there a way to prevent lexeme from consuming newlines? 。
这对于图书馆来说无疑是糟糕的设计。这有点奇怪,因为总的来说,Parsec 是我用过的设计最好的库之一。
另一个小问题是您的分隔符(oneOf ";\n"
)不允许其后有任何空格。如果将其更改为 oneOf ";\n">> skipMany (oneOf "\t"))
,您将能够解析类似 "{ a(); b(); c( ); }` 正确。不幸的是,这对解决早期的重要换行问题没有帮助。
最终,编写自己的词法分析例程来去除尾部空白可能是您最好的选择。这也是了解更多秒差距的一个很好的练习:)。
关于haskell - 函数调用后秒差距意外字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16160012/