3

到目前为止,这是我的代码: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 { }}}

我一直无法弄清楚为什么表达式后面的空格让 parsec 如此沮丧。如果我在 a() 或 b() 之后删除分号,则 parsec 将抱怨下一个调用的第一个字母(即:b 或 c)。如果我重新添加分号,则 parsec 会抱怨空格。任何调用之间没有空格,a() 和 b() 之后的分号但 c() 之后没有分号会导致程序正确解析。相同的测试,除了 c() 后的分号会导致“意外 \n”。

有什么提示吗?

4

1 回答 1

3

主要问题是您希望换行符很重要,但您的词法分析器将它们视为空格。这意味着所有换行符在每个令牌之后都会被静默消耗掉。不幸的是,没有简单的方法解决这个问题:在 Parsec 中,有没有办法防止词素消耗换行符?.

这对于图书馆来说肯定是糟糕的设计。这有点奇怪,因为总的来说,Parsec 是我用过的设计最好的库之一。

另一个小问题是您的分隔符 ( oneOf ";\n") 后面不允许有任何空格。如果将其更改为oneOf ";\n" >> skipMany (oneOf " \t")),您将能够正确解析类似 "{ a(); b(); c(); }` 之类的内容。不幸的是,这无助于早期的重要换行问题。

最终,编写自己的词法分析例程来去除拖尾空白可能是您最好的选择。这也将是学习更多关于 Parsec 的一个很好的练习:)。

于 2013-04-23T03:41:07.153 回答