gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:26:05 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com