Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ANTLRv4实现Java DSL_Java_Parsing_Antlr_Grammar_Dsl - Fatal编程技术网

使用ANTLRv4实现Java DSL

使用ANTLRv4实现Java DSL,java,parsing,antlr,grammar,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

因此,由于分配给我的任务,我最终想知道下一步可能是什么

为了澄清问题,我应该使用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”必须首先获取),或者您必须从“树中的远处”收集数据来生成代码。这意味着,有时在树漫游期间,必须导航到树中不是树漫游中的下一个或上一个节点的其他节点

通常,您的代码生成包括打印固定样板代码,与其他位置的文本交替(例如,“推送(A)”、“推送(B)”、“添加)”,其中“推送(“”)”和“添加”是样板,“A”和“B”是从其他树节点生成的文本

您生成的代码:它可以是任何语言;您似乎选择了用Java来实现它,因此您可以生成Java源代码

您的DSL暗示了GUI元素:您的大多数操作都是“绘制标签,绘制是/否框”,因此生成的java代码可能会调用您选择的一些GUI库来实现这些操作


所有这些都是所谓的“语法导向翻译”的标准实现。如果此时您还不清楚,您需要阅读有关该主题的文章或书籍(Aho/Sethi/Ullman编译器很好),您必须实际构建一个不好的(意味着“开始编码”)为了理解什么是对的,什么是错的。做了一个,你会对什么是错的有很多洞察,然后你可以试着做得更好。

解析DSL规范实例,构建一棵树,遍历树并生成Java代码来实现规范。你正在构建一个小编译器。亲爱的Ira,完成后一些进一步的研究-该方法是完全有效的。除一件事外,AST在ANTLR4中不幸被弃用。而且由于要求使用AST来表示DSL的内部结构-有关于转换的想法吗?我偶然发现了这个类-org.antlr.v4.tool.AST-但仍然没有找到任何引用。我确实知道它被否决的原因,并试图进行权衡以忽略需求-但似乎需求就是需求。有什么想法吗?AST在ANTLR4中被否决了?也许你是指“手动定义的AST”;好吧,ANTLR4将为你构建一个解析树(好的,从技术上讲,这不是AST,但没有必要重复这种区别;您仍然可以遍历树并生成代码)。至于文本,ANTLR有一种称为“字符串模板”的东西。没错-ANTLR4中不推荐使用AST。之所以做出此决定,是因为与此技术相关的效率和可维护性问题。无论如何,我将使用v4,并尝试使用OO建模从解析树对AST进行建模。如果此方法无效,请更正;)你试图做的是从CST中重新发明AST(“使用OO建模”)。如果你真的认为这是必要的……那么,你可以这么做。我构建了一个系统(DMS,请参阅我的简历),可以说只有CST,我们发现真正的AST带来的“额外抽象”并不是一个大的胜利。请参阅