2012-08-29 60 views
8

我正在玩parsec,并意识到我有一个模棱两可的语法。很明显,这是我的错误,但我有点习惯yacc风格的解析器生成器让我知道我是愚蠢的。 Parsec只是按照你给它的解析器的顺序吃字符(是的,我知道关于try)。有没有办法让parsec报告“转移 - 减少”冲突?

有没有什么办法让parsec告诉我什么时候我的语法没有被保留?为我工作的程序非常棒。

谢谢!

(我知道移减轻了与不同种类的解析器技术做。我只是意味着描述歧义语法。)

回答

8

我不是专家秒差距,所以我很容易被纠正,但我不认为这是可能的,原因很简单,Parsec对你的语法一无所知。

或者换句话说,虽然你的语法可能不明确,但你的Parsec分析器不是,程序也没有办法确定一些其他的parsec组合器的排列方式,它们为等效输入产生不同的输出,也是一种未指定语法的有效表示。

既然你确实有语法,你可能更喜欢使用happyalex,这会给你更多的lexx/yacc-like的体验。

一个有趣的项目可能是修改BNFC来生成一个parsec组合器来表示一个语法,但我怀疑这将是一个不平凡的任务。