使用 ANTLRv4 的 Java DSL 实现

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

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

谢谢

最佳答案

你写了一个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/

相关文章:

java - 如何只获取一次数组元素

java - 如何使用 Java 使用现有的 dtd 生成数据示例的 xml 文件

parsing - 有多少种方法来构建解析器?

java - 如何处理正则表达式中的字符 "#"?

python - 具有 "load more"分页的列表的 BeautifulSoup 子页面

php - 什么是智能标签以及如何从 html 中删除它们?

python - malt 解析器在与 nltk 一起使用时给出断言错误

visual-studio-2019 - 哪些 ANTLR Nuget 包是哪些?

java - CSV 语法的 ANTLR4 监听器会导致大文件出现 OutOfMemoryError

java - 如何从另一个 fragment 调用方法