【问题标题】:Java DSL implementation using ANTLRv4使用 ANTLRv4 的 Java DSL 实现
【发布时间】:2015-02-02 22:36:17
【问题描述】:

所以,由于分配给我的任务,我最终想知道下一步实际上可能是什么。

为了澄清事情,我应该使用 Java 来实现一种 DSL 语言。该语言应该使“用户”能够根据输入来指定和创建调查表。

以下输入应提供如下所示的输出:

form taxOfficeExample { 
 "Did you sell a house in 2010?"
   hasSoldHouse: boolean
 "Did you buy a house in 2010?"
   hasBoughtHouse: boolean
 "Did you enter a loan?"
   hasMaintLoan: boolean

if (hasSoldHouse) {
 "What was the selling price?"
   sellingPrice: money
 "Private debts for the sold house:"
   privateDebt: money
 "Value residue:"
   valueResidue: money = (sellingPrice - privateDebt)
}
}

我选择的解析器技术是 ANTLRv4,它似乎是这个平台的最佳选择。无论如何,我熟悉所有模型、术语等——例如解析、词法、语法等——但仍然缺少一件事——Java 和 ANTLRv4 之间的桥梁。

那么根据您的经验,基本上我想知道的是,ANTLRv4 和 Java 之间的桥梁是什么?例如,一旦我为 DSL 定义了一个语法,如何应用该语法(语言)?这两个实体之间的桥梁是什么?

我问这个问题只是因为我在这个领域很新,因此,任何提示、研究论文的指针等都将不胜感激!

谢谢

【问题讨论】:

  • 解析 DSL 规范实例,构建树,遍历树并生成 Java 代码来实现规范。您正在构建一个小型编译器。

标签: java parsing antlr grammar dsl


【解决方案1】:

你写了一个 ANTLR4 语法;您将免费获得“AST”。

遍历树 --> 访问所有节点。

在每个节点上,假设已经实现了其他已经访问过的节点的效果,你想尝试用你的目标语言生成一个文本字符串来实现该节点的效果。

实际上,有时您必须乱序生成代码(解析后的“a+b”将以“+”作为根并首先被访问,但很明显“a”必须被获取[所以需要代码来生成它],并且必须首先获取“b”),或者您将不得不从“树中的远处”收集数据来进行代码生成。这意味着有时在树遍历期间,您必须导航到树中的某个其他节点,该节点不是树遍历中的下一个或上一个节点。

您的代码生成通常包括打印固定样板代码,与其他地方的文本交替使用(例如,“push(A)”、“push(B)”、“add”,其中 'push(' ')' 和'add' 是样板文件,'A' 和 'B' 是从其他树节点生成的文本。

您生成的代码:可以是任何语言;你似乎选择了用 Java 来做,所以你可以生成 Java 源代码。

您的 DSL 隐含了 GUI 元素:您的大部分操作都是“绘制标签,绘制是/否框”,因此您生成的 java 代码可能会调用您选择的一些 GUI 库来实现这些行动。

所有这些都是所谓的“语法导向翻译”的标准实现。如果此时您还不清楚,您需要阅读有关该主题的文章或书籍(Aho/Sethi/Ullman Compilers 很好),并且您必须实际构建一个坏的一个(意思是“开始编码”),以了解什么是对的,什么是错的。完成一项后,您将深入了解问题所在,然后您可以尝试做得更好。

【讨论】:

  • 亲爱的艾拉,在做了一些进一步的研究之后——这种方法是完全有效的。除了一件事,不幸的是,AST 在 ANTLR4 中已被弃用。而且由于要求是使用 AST 来表示 DSL 的内部结构 - 关于转换的任何想法?我偶然发现了这个类——org.antlr.v4.tool.ast——但仍然没有找到任何对它的引用。而且我确实知道它被弃用的原因,并试图做出权衡以忽略要求 - 但似乎要求就是要求。有什么想法吗?
  • AST 在 ANTLR4 中已被弃用?也许您的意思是“手动定义的 AST”; AFAIK,ANTLR4 将为您构建一棵解析树(好吧,从技术上讲,它不是 AST,但没有什么意义;您仍然可以遍历树并构建代码)。至于吐出文本,ANTLR 有一个叫做“字符串模板”的东西。
  • 没错 - AST 在 ANTLR4 中已被弃用。做出此决定是因为存在与此技术相关的效率和可维护性问题。无论如何,我将继续使用 v4,并尝试使用 OO 建模从解析树建模 AST。如果该方法无效,请纠正我;)
  • 您尝试做的是从 CST 重新发明 AST(“使用 OO 建模”)。如果你真的认为这是必要的......好吧,那么你可以这样做。我构建了一个可以说只有 CST 的系统(DMS,请参阅我的简历),我们发现真正的 AST 带来的“额外抽象”并没有足够大的胜利来打扰。见stackoverflow.com/a/1916687/120163
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多