Java 使用 ANTLRv4 的 DSL 实现

Java DSL implementation using ANTLRv4

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

澄清一下,我应该使用 Java 来实现 DSL 语言。该语言应启用 "user" 指定并创建当然基于输入的调查表。

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

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 定义了语法,如何应用该语法(语言)?这两个实体之间的桥梁是什么?

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

谢谢

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

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

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

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

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

您生成的代码:可以是任何语言;您似乎已选择在 Java 中执行此操作,因此您可以生成 Java 源代码。

您的 DSL 隐含了 GUI 元素:您的大部分操作都是 "paint a label, paint a yes/no box",因此您生成的 java 代码可能会调用您选择的可以实现这些操作的某些 GUI 库.

所有这些都是所谓"syntax-directed translation"的标准实现。如果此时您还不清楚,您需要阅读有关该主题的文章或书籍(Aho/Sethi/Ullman Compilers 很好),并且您实际上必须构建一个坏的(意味着,"start coding")以了解什么是对的,什么是错的。做完一个,你就会很清楚哪里出了问题,然后你就可以尝试做得更好。