1

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

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

除了解决方案的有点混乱之外,我唯一遇到的问题是

  • 进行 v-tbl 混合的合理方法
  • 当 2 个扩展改变相同的产品时该怎么办(因为大多数替换最终会调用原来的替换调用另一个会起作用,但设置它的机制是问题)
  • 如何允许扩展扩展(这可能最终看起来像一个标准的 MI 系统,但我从来不知道它们是如何工作的)

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

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

4

5 回答 5

1

These are some of the challenges the Perl 6 design effort has faced. You may find it worthwhile looking into some of the solutions they came up with. Or you may find that to be gross overkill.

于 2008-10-24T05:58:38.580 回答
1

我做了一个可配置的解析器,前段时间在 http://code.google.com/p/compparser/上传了它 。那里的项目不是最新的,但运行良好。

于 2010-02-01T09:08:42.257 回答
0

如果我正确地记得我的大学课程,递归下降解析器有一些限制可能会咬你,特别是因为你允许扩展 - 其他人的语言扩展可能会导致问题。

一个合适的编译器工具包——比如开源的ANTLR——可能会使事情变得更容易,并且还可能为您提供一些不同的方法。

于 2008-10-24T06:05:31.390 回答
0

另一种选择是用 XML 或其他东西而不是代码来表达解析规则;效率较低,但可动态配置得多;每种语言或变体都可以只使用自己的(XML)文件,甚至包括/引用其他文件作为“基础”文件......

于 2008-10-24T06:51:49.487 回答
0

坦率地说,我什至不确定我是否理解你所写的一切...... :-)

但是当我看到解析器灵活性时,我想到了LPeg-Parsing Expression Grammars For Lua。它可能不符合您的需求,但值得一看... ;-)

于 2008-10-24T09:56:14.483 回答