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

smw*_*dia 2 compiler-construction antlr ll-grammar formal-languages

(几天前我和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跳过?

Ira*_*ter 5

关于ADD1:

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

我同意,人们需要更进一步.解析后有一个巨大的生命.

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

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

许多临时技术秘书处一次只能使用"一种"语言; 你可以转换那个对代码生成不起作用的语言.它们通常允许你可以构建两个语言,源和目标的联合语法的hack,然后你可以修改源语言中的AST以在目标语言中创建AST.这确实允许代码生成,但联合语言特技产生了很多混乱.例如,如果您有一个"+"节点,它是源语言或目标中的"+"节点吗?你肯定不想翻译两次.

我们的DMS软件再造工具包将同时处理许多(包括"两个")语言.您可以从源变换到目标语言,并对结果进行漂亮打印.因为源"+"节点与目标"+"节点不同,所以没有混淆.

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

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

使用各种语义分析,可以验证源程序是有效的,运行复杂的转换,它依赖于源程序中"远离"发现的信息,并提供对"目标"语言的优化转换.

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

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

[旁注:DMS可以通过Java前端获得.这包括用于解析和处理JVM二进制代码的其他支持机制.这可用于实现后处理到JVM二进制步骤.或者,你可以自己动手].

DMS作为一种工具的设计目标是涵盖涵盖语言翻译("编译"是一种特殊情况)和程序分析的广泛应用.它相应更雄心勃勃,比ANTLR更大,相应更强大.