我想为C语言构建一个解析器。关于它的有趣方面是我希望以这样的方式构建它:有权访问源的人可以轻松地修改它以扩展语言(实例的新表达类型),扩展名是运行时可配置的(它们可以是打开和关闭)。
我目前的目的是构建一个递归的正确解析器作为对象。每个生产都是一个对象的方法。扩展方法是根据需要从此基础派生类替换方法(和生产定义)。我还在试图弄清楚如何混合和匹配扩展。一个想法是用v-tbl玩游戏。对象将使用v-tbl构造,v-tbl是基类的副本,但方法已从派生类中替换。
除了解决方案的一点点性质之外,我遇到的唯一问题是
另一个解决方案(相同方法的稍微平凡的版本)将使用静态成员变量来存储函数指针并调用它们以获得相同的效果。
编辑:我已经构建了一个系统,可以让我根据BNF定义构建作品。我可以改变它以支持我决定的任何事情。
答案 0 :(得分:1)
这些是Perl 6设计工作面临的一些挑战。您可能会发现值得研究一下他们提出的一些解决方案。或者你可能会发现这是一种严重的过度杀伤。
答案 1 :(得分:1)
我做了一个可配置的解析器,我前一段时间在uploadei http://code.google.com/p/compparser/ 该项目不是最新的,但工作正常。
答案 2 :(得分:0)
如果我正确地回忆起我的大学课程,递归下降解析器有一些限制可能会让你感到困惑,特别是因为你允许扩展 - 有些人可能会导致语言扩展问题。
正确的编译工具包 - 例如开源ANTLR - 可能会使事情变得更容易,也可能为您提供一些不同的方法。
答案 3 :(得分:0)
另一种选择是用XML或其他东西来表达解析规则,而不是代码;效率较低,但动态可配置性更强;每种语言或变体都可以使用自己的(XML)文件,甚至包含/引用其他文件作为“基础”文件......
答案 4 :(得分:0)
但是当我看到解析器和灵活性时,我想到了LPeg - Parsing Expression Grammars For Lua。它可能不适合您的需求,但值得一看......; - )