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

Parsing 关于如何制作可配置解析器的建议,parsing,bit-manipulation,configurability,Parsing,Bit Manipulation,Configurability,我想为类C语言构建一个解析器。有趣的是,我想以这样一种方式构建它,即有权访问源代码的人可以轻松地修改它以扩展语言(实例的一种新表达式类型),扩展是运行时可配置的(可以打开和关闭) 我目前的目的是构建一个递归的像样的解析器作为对象。每个产品都是一个对象的方法。扩展的方法是从这个基础派生类,根据需要替换方法(和产品定义)。我仍在试图找出如何混合和匹配扩展。一个想法是和v-tbl玩游戏。对象将使用一个v-tbl来构造,该v-tbl是基的副本,但使用从派生类替换的方法 除了解决方案有点烦人之外,我唯一的

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

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

除了解决方案有点烦人之外,我唯一的问题就是

  • 一种合理的v-tbl合成方法
  • 当两个扩展改变了相同的产品时,该怎么办(因为大多数替换最终都会调用原始产品,有一个替换调用,另一个可以工作,但设置这个的机制是个问题)
  • 如何允许扩展(这可能最终看起来像一个标准的MI系统,但我从未了解它们是如何工作的)
另一个解决方案(相同方法的一个稍微普通的版本)是使用静态成员变量存储函数指针,并调用它们以获得相同的效果


编辑:我已经建立了一个系统,允许我从BNF定义中生成产品。我可以修改它以支持我决定的任何内容。

这些是Perl 6设计工作所面临的一些挑战。你可能会发现研究他们提出的一些解决方案是值得的。或者你可能会发现这太过分了。

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


一个合适的编译器工具包——比如开源工具——可能会让事情变得更简单,也可能会为您提供一些不同的方法。

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

坦白说,我甚至不确定我是否理解了您编写的所有内容…:-)


但当我看到解析器和灵活性时,我想到了。它可能不适合您的需要,但非常值得一看…;-)

我制作了一个可配置的解析器,不久前在
那里的项目不是最新的,但运行良好。

我(痛苦地)意识到递归体面(以及一般的LL)的局限性:(.我尝试过ANTLR,但从来没有真正让它正常工作过。虽然它可能是可用的,但我可能必须修改它的内部结构才能使用它。在某些方面也要复杂得多。我必须解析XML(或其他)然后从中构建一个可以立即运行的解析器。优点是“代码”更少,但要做到这一点,我需要避免为语法中的操作编写代码(Ouch)。@[BCS]:您只需要一种在XML中指定它们的方法(例如程序集名称、类名称、方法名称、parm绑定)这将允许您动态地执行它们。我已经这样做了(在C中),它并不简单,但非常灵活。