【发布时间】:2013-03-11 21:12:50
【问题描述】:
我正在尝试为配置文件编写解析器,但遇到了一个奇怪的错误,解析器只是冻结了。代码可见here。我已经在调试器中运行它,它似乎发生在行中
p_server_entry = many settings *> pure ()
在“纯()”的评估。也就是说,如果可以信任调试器的行为,则尝试从 p_server_entry 返回似乎会失败。我尝试删除“纯()”语句并简单地返回“[()]”(并显然调整类型签名)但它似乎挂在同一个地方。我知道 Parsec 不支持左递归,但我看不到这里发生了什么?
我正在做的是,我正在使用 Parsec 通过用户状态为我填写记录。对于返回值,我只是从所有函数中返回 (),因为配置记录将从状态中检索并作为解析结果返回。导致挂起的示例文件是:
[server]
port = 80
我通过在 ghci 中运行 Parser.hs 文件来测试这一点(尽管编译程序并运行它会得到相同的结果)然后执行
:m + Data.Monoid
parseConfigFile "test.config" mempty
感谢任何人提供的任何帮助。
编辑:我应该提到这几乎和以前一样工作。我把它从返回一个特殊的解析树改为直接更新配置结构。
【问题讨论】:
-
疯狂猜测:
settings是否匹配空字符串? -
没有。我链接了上面的整个源代码,您可以在其中看到所有定义。
-
我不愿意阅读 100 多行代码只是为了在这里回答一个问题。请在下次仍然显示错误时提供short, self-contained example。并且请不要链接到外部代码,因为外部链接可能不是持久的,但这个问题是。