所以,由于我的任务,我最终想知道下一步可能是什么。
为了澄清事情,我应该使用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定义语法,该语法(语言)如何应用?这两个实体之间的桥梁是什么?
我问这个问题只是因为我在这个领域很新,因此,任何提示,研究论文指针等都将受到赞赏!
谢谢
答案 0 :(得分:5)
你写了一个ANTLR4语法;你会得到一个" AST"免费。
走树 - >访问所有节点。
在每个节点上,您希望尝试使用目标语言生成文本字符串,以实现该节点的效果,假设已经实现了已访问过的其他节点的效果。
实际上,有时你必须无序地生成代码(" a + b"解析后会有" +"作为根,并且会被访问首先,但很明显,#34; a"必须被提取[因此需要代码来生成],并且必须首先获取" b"或者您必须收集数据来自"远在树上"做代码生成。这意味着有时在树行走期间,您必须导航到树中不是树行走中的下一个或上一个节点的其他节点。
通常,您的代码生成包括打印固定的样板代码,与来自其他地方的文本交替(例如,"推(A)","推(B)",& #34;添加",其中'推送('')''添加'是样板,' A'和' B'是从其他树节点生成的文本。
您生成的代码:它可以是任何语言;您似乎选择在Java中执行此操作,因此您可以生成Java源代码。
您的DSL隐含了GUI元素:您的大部分操作都是"绘制标签,绘制是/否框",因此您生成的Java代码可能会调用您的某些GUI库可以实现这些行动的选择。
所有这些都是所谓的"语法导向翻译的标准实现"。如果此时您还不清楚,您需要阅读有关该主题的文章或书籍(Aho / Sethi / Ullman 编译器是好的),您必须实际构建一个坏的(手段,"开始编码"),以了解哪些是正确的,哪些是错的。做完一个之后,你会对出了什么问题有很多了解,然后你可以尝试做得更好。