首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除了ANTLR之外,还有什么其他工具可以帮助我创建一个针对JVM的小语言呢?

除了ANTLR之外,还有什么其他工具可以帮助我创建一个针对JVM的小语言呢?
EN

Stack Overflow用户
提问于 2017-01-03 08:39:21
回答 2查看 233关注 0票数 3

(几天前,我在ANTLR开始了我的语言冒险。我对语言理论和编译结构的了解非常有限。如果这不是一个有效的问题,请原谅。)

ANTLR是一个解析器生成器,特别是一个ALL(*)解析器。根据这里,解析器是:

编译器中试图使源代码具有语法意义的部分。

AFAIK编译器应该由5个阶段组成:

  1. 词汇分析
  2. 句法分析
  3. 语义分析
  4. IL表示与优化
  5. 代码生成

因此,ANTLR似乎只覆盖了1和2。

因此,如果我想为一个针对JVM上Java字节代码的教育目的语言编写一个编译器。第3-5阶段我还能利用什么其他工具?

加1

为什么ANTLR只覆盖1和2?我想4和5被跳过了,因为它们对目标平台太特殊了。但是为什么3被ANTLR跳过呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-03 10:29:44

关于ADD1:

ANTLR做1)和2),因为这是为它定义的目标。作者认为您很乐意从头开始编写任何编译器的"rest“。

我同意,还需要做更多的工作。有一个巨大的解析后的生命

如果您想要一个处理不仅仅是解析的工具,那么您需要一个目标相应更大的工具。

一个更通用的工具类是程序转换系统(PTS)。这些工具允许您定义语法,就像ANTLR一样,并将生成解析器,将自动为该语言从源构建抽象语法树,提供修改这些AST的方法(通常是“源到源”重写规则),并最终修改修改后的AST以生成等效的源代码输出。

许多PTS一次只能使用“一种”语言;您可以转换该语言,因为它不适用于代码生成。它们通常允许黑客攻击,您可以在其中构建一个由源和目标两种语言组成的联合语法,然后您可以修改源语言中的AST,以便在目标语言中生成AST。这确实允许代码生成,但是联合语言特技会造成许多混乱。例如,如果您有一个"+“节点,那么它是源语言中的"+”节点还是目标节点?你肯定不想翻译两遍。

我们的DMS软件重组工具包将同时处理许多语言(包括“两种”)。您可以从源转换到目标langauge,并打印结果。因为源"+“节点与目标"+”节点不同,所以没有混淆。

通常,AST只执行AST操作。您可以通过滥用重写规则将AST“重写”为表示语义谓词结果的布尔值来实现任意语义分析。这很尴尬。

DMS通过属性语法提供语义分析,属性语法是以语法规则为指导,在as上根据计算定义任意分析的方法。您可以轻松地构建符号表,控制流图,并以这种方式进行典型类型检查。DMS还提供了跨控制流图进行数据流分析的方法。

使用各种语义分析,可以验证源程序是有效的,运行复杂的转换,这些转换依赖于在源程序中找到的“很远”的信息,并对“目标”语言进行优化转换。

如果将目标语言定义为IL,则可以进行源到IL的转换和优化。

定义作为JVM代码的IL并不那么容易;毕竟,这是虚拟指令集的二进制表示。使用像DMS这样的PTS,您可以定义一个目标语言,它是JVM指令的表面语法(例如JVM转储会产生什么),生成它,然后运行一个非常简单的后处理步骤,将其转换为实际的JVM二进制代码。使用DMS,您可以将该后处理步骤作为JVM表面语法目标语言AST上的属性语法计算来实现。

附带注意:可以使用Java前端获得DMS。这包括用于解析和处理JVM二进制代码的额外支持机制。这可以用于实现进程后到JVM的二进制步骤。或者,你也可以自己玩。

DMS作为工具的设计目标是涵盖广泛的应用,包括语言翻译(“编译”是一个特例)和程序分析。它比ANTLR更有雄心,比ANTLR更强大。

票数 6
EN

Stack Overflow用户

发布于 2017-01-03 23:44:12

既然你似乎在使用ANTLR,我建议你购买一份

"语言实现模式-创建您自己的特定域和通用编程语言“和

"明确的ANTLR 4参考文献“( 特伦斯·帕尔 )

第3-5阶段我还能利用什么其他工具?

特伦斯·帕尔 -- ANTLR的创建者--也创建了可以用于AST转换的字符串模板,但是还有其他工具填补了这个空白。见:程序转换系统列表。请注意,Ira在他的答复中已经注意到了DMS。

对于第三阶段,语义分析,您可以使用ANTLR。参见:ANTLR:如何使用树语法替换子树中的特定节点?作为一个例子。书中还讨论了进行语义分析的其他方法。

第4-5阶段改为第10章,Building Bytecode Interpreters.

对于初学者来说,这是一个很好的开始,但它只会让你开始。

对于第4-5阶段的快速搜索,我发现在快速阅读之后,这是有意义的,所以我会提到它,但没有保证。简而言之,在第4-5阶段使用贾瓦克。由于博客托管在Oracle上,我认为只有Oracle Javac才能工作。

一种非常有趣的方法是构造表示java代码结构的AST节点,然后从它生成字节码。实际上,这就是javac所做的。

通过构建AST树生成java字节码

为什么反far只覆盖1和2?

来自用ANTLR v4重写树

引用特伦斯·帕尔

因为大多数ANTLR用户不构建编译器,所以我决定关注ANTLR v4的其他应用程序:解析和提取信息,然后再进行翻译。

所以在第一、第二和第三阶段,你可以使用ANTLR,

对于AST转换,如果有必要,可以使用字符串模板和

对于第4和第5阶段,您可以使用Javac。

这只是一个开始,你还有很长的路要做,还有很多研究要做。我建议你在路上记大量的笔记。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41439438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档