haskell - 函数调用后秒差距意外字符

标签 haskell parsec

这是迄今为止我的代码: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/

相关文章:

Haskell 中任何顺序或维度的列表理解

regex - Haskell 在一次传递中用正则表达式替换多个子字符串

haskell - 连接解析结果

delphi - 如何在 Parsec 中定义多种类型的注释 block

haskell - 使用 Parsec 按字符串正确分割

haskell - Unresolved 顶级重载

scala - "coalgebra"在编程上下文中是什么意思?

haskell - 我怎样才能把它写成隐式递归?

parsing - 使用 Haskell 解析引号

parsing - 你如何以贪婪的方式使用 parsec?