Vie*_*iet 14 peg parser-generator yard php-parser
我很享受YARD的使用:
http://code.google.com/p/yardparser/
http://www.codeproject.com/KB/recipes/yard-tokenizer.aspx
我能够构建全功能计算器.我正在评估YARD做PHP解析器.请关注PEG语法和解析器生成器的局限性.非常感谢你!
DrP*_*zza 18
我认为PEG的一个重大问题是它们不符合语法的正常分类,因为它们以一种根本不同的方式运作.正常语法是"向后"的,因为它们描述了可以生成的所有可能的句子(程序).PEG描述了如何解析 - 他们从另一端解决问题.
在我看来,这是一种更自然的思考问题的方法,当然对于任何手写(递归 - 下降)解析器我都不会做任何其他事情.
PEG语法的主要限制是它们根本不处理歧义.
可以肯定的是,这也是他们的优势,因为处理含糊不清是使用CFG(无上下文语法)工具中最令人沮丧的部分之一.
使用PEG,您可以通过在另一个模糊匹配但不需要的规则之前对要匹配的规则进行排序来明确处理歧义.
问题是你甚至不知道语言或语法中的某些甚至任何歧义和PEG生成器,至少我试过的那些,不会分析语法歧义以帮助你找到他们然后设计和订购你的规则,以正确的方式处理它们.
像yacc和bison这样的CFG解析器生成器会分析你的语法并报告所有的歧义.不幸的是,他们经常以一种非常神秘的方式报道它们,这很难理解.当然,通常很难修复语法来处理它们.但至少你会意识到它们存在.
使用PEG语法,你可以幸福地忽略概念语法中的歧义,因为一旦你把它变成PEG就不再有歧义了,它只是有匹配的规则,也许是默默无法达到的规则,如果它们有更高的值也会匹配优先.这些可能不会出现在您的测试中,但可能会在发布后显示出来.
使用CFG语法,您不得不在开发过程中处理歧义,但这并不容易.
如果我没有说清楚,这是Joshua Haberman关于Lambda终极编程语言博客的六年讨论:PEGs和Packrat Parsing不是答案.