到目前为止,这是我的代码:http://hpaste.org/86353。我正在Windows上构建w / 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”。
任何提示?
答案 0 :(得分:3)
主要问题是你想要换行符,但你的词法分析器将它们视为空格。这意味着在每个令牌之后,所有换行都会被静默消耗。不幸的是,没有简单的方法:In Parsec, is there a way to prevent lexeme from consuming newlines?。
这肯定是图书馆的糟糕设计。这有点奇怪,因为一般来说,Parsec是我用过的最好设计的库之一。
另一个小问题是你的分隔符(oneOf ";\n"
)不允许跟随它的任何空格。如果将其更改为oneOf ";\n" >> skipMany (oneOf " \t"))
,您将能够正确解析类似“{a(); b(); c();}`的内容。不幸的是,这对于重要换行符的早期问题没有帮助
最终,编写自己的lexing例程来划分尾部空格可能是最好的选择。这也是学习Parsec的更好的练习:)。