使用ANTLRv4的Java DSL实现

时间:2015-02-02 22:36:17

标签: java parsing antlr grammar dsl

所以,由于我的任务,我最终想知道下一步可能是什么。

为了澄清事情,我应该使用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)
}
}

Step 1 Step 2

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

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

我问这个问题只是因为我在这个领域很新,因此,任何提示,研究论文指针等都将受到赞赏!

谢谢

1 个答案:

答案 0 :(得分:5)

你写了一个ANTLR4语法;你会得到一个" AST"免费。

走树 - >访问所有节点。

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

实际上,有时你必须无序地生成代码(" a + b"解析后会有" +"作为根,并且会被访问首先,但很明显,#34; a"必须被提取[因此需要代码来生成],并且必须首先获取" b"或者您必须收集数据来自"远在树上"做代码生成。这意味着有时在树行走期间,您必须导航到树中不是树行走中的下一个或上一个节点的其他节点。

通常,您的代码生成包括打印固定的样板代码,与来自其他地方的文本交替(例如,"推(A)","推(B)",& #34;添加",其中'推送('')''添加'是样板,' A'和' B'是从其他树节点生成的文本。

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

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

所有这些都是所谓的"语法导向翻译的标准实现"。如果此时您还不清楚,您需要阅读有关该主题的文章或书籍(Aho / Sethi / Ullman 编译器是好的),您必须实际构建一个坏的(手段,"开始编码"),以了解哪些是正确的,哪些是错的。做完一个之后,你会对出了什么问题有很多了解,然后你可以尝试做得更好。