关于如何制作可配置解析器的建议

时间:2008-10-24 05:27:08

标签: parsing bit-manipulation configurability

我想为C语言构建一个解析器。关于它的有趣方面是我希望以这样的方式构建它:有权访问源的人可以轻松地修改它以扩展语言(实例的新表达类型),扩展名是运行时可配置的(它们可以是打开和关闭)。

我目前的目的是构建一个递归的正确解析器作为对象。每个生产都是一个对象的方法。扩展方法是根据需要从此基础派生类替换方法(和生产定义)。我还在试图弄清楚如何混合和匹配扩展。一个想法是用v-tbl玩游戏。对象将使用v-tbl构造,v-tbl是基类的副本,但方法已从派生类中替换。

除了解决方案的一点点性质之外,我遇到的唯一问题是

  • 合理的方式来进行v-tbl mixup
  • 当2个扩展名改变相同的作品时该做什么(因为大多数替代品最终会调用原始版本进行一次替换调用,而另一次替换将会起作用,但设置此功能的机制是问题)
  • 如何允许扩展扩展(这可能最终看起来像一个标准的MI系统,但我从来没有得到它们的工作方式)

另一个解决方案(相同方法的稍微平凡的版本)将使用静态成员变量来存储函数指针并调用它们以获得相同的效果。

编辑:我已经构建了一个系统,可以让我根据BNF定义构建作品。我可以改变它以支持我决定的任何事情。

5 个答案:

答案 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。它可能不适合您的需求,但值得一看......; - )