1

这是背景,我正在尝试创建一个 DSL 以允许客户编写简单的脚本来查询我们基于 mongodb 的数据库。我选择antlr来实现DSL。

根据我的理解(如果不正确,请告诉我)有两种方法可以将 antlr 生成的解析器集成到系统中:

  1. 将代码嵌入到语法文件中,以便生成的解析器可以直接用于查询数据库并以某种格式(例如json编码)返回结果
  2. 在将 DSL 文件提供给它之后,保持解析器纯粹是一个解析器,并通过从生成的解析器类中检索 AST 在另一个类中构造查询

所以antlrers,你认为我作为一个antlr新手应该走哪一条路?您能否列出每种方法的优缺点,或者您有其他方法可以推荐?

4

1 回答 1

3

您不应该将业务逻辑嵌入到您的解析器中,因为潜在的维护难题:您不想重新编译语法来修复业务逻辑中的错误,更不用说在生成的解析器中调试业务逻辑的噩梦前景了。因此,除了最小的玩具项目之外,选项一应该是不可能的。

选项 2 可以通过多种方式实现:您可以 (A) 让 ANTLR 为您生成 AST 节点,然后编写一个树解析器,或者 (B) 您可以跳过树解析器,并在解析器。我在生产项目中尝试了这两种方法,包括 Java 和 C#,这两种方法都非常有效。我认为 (A) 和 (B) 之间的选择很大程度上取决于您的个人喜好,只要业务逻辑不受解析器的影响。

于 2012-06-26T03:11:55.267 回答