(几天前,我在ANTLR开始了我的语言冒险。我对语言理论和编译结构的了解非常有限。如果这不是一个有效的问题,请原谅。)
ANTLR是一个解析器生成器,特别是一个ALL(*)解析器。根据这里,解析器是:
编译器中试图使源代码具有语法意义的部分。
AFAIK编译器应该由5个阶段组成:
因此,ANTLR似乎只覆盖了1和2。
因此,如果我想为一个针对JVM上Java字节代码的教育目的语言编写一个编译器。第3-5阶段我还能利用什么其他工具?
加1
为什么ANTLR只覆盖1和2?我想4和5被跳过了,因为它们对目标平台太特殊了。但是为什么3被ANTLR跳过呢?
发布于 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更强大。
发布于 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所做的。
为什么反far只覆盖1和2?
引用特伦斯·帕尔
因为大多数ANTLR用户不构建编译器,所以我决定关注ANTLR v4的其他应用程序:解析和提取信息,然后再进行翻译。
所以在第一、第二和第三阶段,你可以使用ANTLR,
对于AST转换,如果有必要,可以使用字符串模板和
对于第4和第5阶段,您可以使用Javac。
这只是一个开始,你还有很长的路要做,还有很多研究要做。我建议你在路上记大量的笔记。
https://stackoverflow.com/questions/41439438
复制相似问题