PEG语法的限制&解析器生成器?

时间:2009-12-06 23:32:43

标签: parser-generator yard peg php-parser

我很享受YARD的使用:

http://www.ootl.org/yard/

http://code.google.com/p/yardparser/

http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx

我能够构建全功能计算器。我正在评估YARD做PHP解析器。请关注PEG语法和限制的局限性。解析器生成器。非常感谢你!

2 个答案:

答案 0 :(得分:18)

我认为PEG的一大问题是它们不符合语法的正常分类,因为它们以完全不同的方式运作。正常语法是“向后”的,因为它们描述了可以生成的所有可能的句子(程序)。 PEG描述了如何解析 - 他们从另一端解决问题。

在我看来,这是一种更自然的方式来思考这个问题,当然对于任何手写(递归 - 下降)解析器我都不会做任何其他事情。

答案 1 :(得分:5)

PEG语法的主要限制是它们根本不会处理歧义。

可以肯定的是,这也是他们的优势,因为处理含糊不清是使用CFG(无上下文语法)工具中最令人沮丧的部分之一。

使用PEG可以明确地处理歧义,方法是在另一个模糊匹配的规则之前对您要匹配的规则进行排序,但是您不想要这个规则。

问题在于,你甚至不知道语言,语法和PEG生成器中的某些甚至任何含糊之处,至少我已尝试过,不要分析歧义的语法,以帮助你找到它们,然后设计和订购你的规则,以正确的方式处理它们。

像yacc和bison这样的CFG解析器生成器会分析你的语法并报告所有的歧义。不幸的是,他们经常以一种非常神秘的方式报道它们,这很难理解。当然,通常很难修复语法来处理它们。但至少你会意识到它们存在。

使用PEG语法,你可以幸福地忽略概念语法中的含糊之处,因为一旦你把它变成PEG它就不会有歧义,它只是有匹配的规则,也许是无法实现的无法达到的规则匹配,如果他们有更高的优先权。这些可能不会出现在您的测试中,但可能会在发布后显示出来。

使用CFG语法,你不得不在开发过程中处理歧义,但这并不容易。


如果我没有说清楚,那么Joshua Haberman将在 Lambda the Ultimate 编程语言博客上进行为期六年的讨论: PEGs and Packrat Parsing are not the answer