我想为类似 C 的语言构建解析器。关于它的有趣方面是我想以这样一种方式构建它,即有权访问源代码的人可以轻松修改它以扩展语言(一种新的表达式类型的实例),扩展是运行时可配置的(它们可以是打开和关闭)。
我目前的意图是构建一个像样的递归解析器作为对象。每个产生式都将是一个对象的一个方法。扩展的方法是根据需要从这个基础替换方法(和生产定义)派生类。我仍在尝试弄清楚如何混合和匹配扩展。一个想法是用 v-tbl 玩游戏。对象将使用 v-tbl 构造,该 v-tbl 是基类的副本,但使用派生类替换的方法。
除了解决方案的有点混乱之外,我唯一遇到的问题是
- 进行 v-tbl 混合的合理方法
- 当 2 个扩展改变相同的产品时该怎么办(因为大多数替换最终会调用原来的替换调用另一个会起作用,但设置它的机制是问题)
- 如何允许扩展扩展(这可能最终看起来像一个标准的 MI 系统,但我从来不知道它们是如何工作的)
另一种解决方案(相同方法的稍微普通的版本)是使用静态成员变量来存储函数指针并调用它们以获得相同的效果。
编辑:我已经构建了一个系统,可以让我从 BNF 定义构建产品。我可以改变它来支持我决定的任何事情。