因此,由于分配给我的任务,我最终想知道下一步实际上是什么。
澄清一下,我应该使用 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 定义了语法,如何应用该语法(语言)?这两个实体之间的桥梁是什么?
我问这个问题只是因为我在这个领域还很新,因此,任何提示、研究论文的指针等都将不胜感激!
谢谢
最佳答案
你写了一个ANTLR4语法;您将免费获得“AST”。
遍历树 --> 访问所有节点。
在每个节点,假设已经访问过的其他节点的效果已经实现,你想尝试用你的目标语言生成一个实现该节点效果的文本字符串。
作为一个实际问题,有时你必须乱序生成代码(解析的“a+b”将以“+”为根,并且将首先访问它,但很明显“a”必须被获取[因此需要代码来生成它],并且必须首先获取“b”),否则您将不得不从“树的远处”收集数据以进行代码生成。这意味着有时在树遍历期间,您必须导航到树中的某个其他节点,该节点不是树遍历中的下一个或上一个节点。
您的代码生成通常包括打印固定的样板代码,与来自其他地方的文本交替出现(例如,“push(A)”、“push(B)”、“add”,其中 'push(' ')' 和“add”是样板文件,“A”和“B”是从其他树节点生成的文本。
您生成的代码:它可以是任何语言;你似乎选择了用 Java 来做,所以你可以生成 Java 源代码。
您的 DSL 隐含了 GUI 元素:您的大部分操作都是“绘制标签,绘制是/否框”,因此您生成的 Java 代码可能会调用您选择的一些 GUI 库来实现这些 Action 。
所有这些都是所谓“语法制导翻译”的标准实现。如果此时您还不清楚,您需要阅读有关该主题的文章或书籍(Aho/Sethi/Ullman Compilers 很好),并且您必须实际构建一个不好的一个(意思是“开始编码”),以便了解什么是对的,什么是错的。完成一项后,您将深入了解哪里出了问题,然后您可以尝试做得更好。
关于使用 ANTLRv4 的 Java DSL 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288111/