首页 文章

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

提问于
浏览
2

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

ANTLR是一个解析器生成器,具体来说,是一个 ALL(*) 解析器 . 根据here,解析器是:

编译器中试图对语法进行语法感知的部分 .

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

  • 词法分析

  • 语法分析

  • 语义分析

  • IL表示和优化

  • 代码生成

所以ANTLR似乎只覆盖了1和2 .

因此,如果我想为教育目的语言编写一个编译器,该语言目标是JVM上的Java字节代码 . 我可以在第3-5阶段使用哪些其他工具?

ADD 1

为什么ANTLR只覆盖1和2?我猜4和5被跳过,因为它们对目标平台来说太具体了 . 但为什么3被ANTLR跳过?

2 回答

  • 2

    关于ADD1:

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

    我同意,人们需要更进一步 . 有一个巨大的Life After Parsing .

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

    更一般的工具类是Program Transformation Systems (PTS) . 这些工具允许你定义一个语法,就像ANTLR一样,并将生成一个解析器,将自动从该语言的源代码构建抽象语法树,提供修改这些AST的方法(通常是"source-to-source"重写规则),最后将修改后的AST修改为生成等效的源代码输出 .

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

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

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

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

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

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

    定义一个JVM代码的IL并不那么容易;毕竟,'s a binary representation of a virtual instruction set. With a PTS like DMS, you'd定义了一种目标语言,它是JVM指令的表面语法(例如,JVM转储会产生什么),生成它,然后运行一个相当简单的后处理步骤将其转换为实际的JVM二进制文件码 . 使用DMS,您可以将该后处理步骤实现为针对JVM表面语法目标语言的AST的属性语法计算 .

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

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

  • 5

    因为你似乎正在研究ANTLR I建议你购买一份
    Language Implementation Patterns - Create Your Own Domain-Specific and General Programming Languages”和
    The Definitive ANTLR 4 Reference”by Terrence Parr

    我可以在第3-5阶段使用哪些其他工具?

    Terrence Parr ANTLR的创建者也创建了String Template,可用于AST转换,但还有其他工具可以填补这个空白 . 见:List of program transformation systems . 请注意,Ira在他的回答中已经注意到了DMS .

    对于阶段3,语义分析,您可以使用ANTLR . 请参阅:ANTLR: How to replace specific nodes in a subtree using a Tree grammar?作为示例 . 书中还讨论了进行语义分析的其他方法 .

    对于4-5阶段,请阅读第10章 Building Bytecode Interpreters .
    对于初学者来说这是一个很好的起点,但它只会让你开始 .

    要么

    对于快速搜索的4-5阶段,我发现这一点在快速阅读后有意义所以我会提到它,但不能保证 . 简而言之,对于阶段4-5使用Javac . 由于博客托管在Oracle上,我认为只有Oracle Javac才能运行 .

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

    Generating java byte code by building AST trees

    为什么ANTLR只覆盖1和2?

    来自Tree rewriting in ANTLR v4

    引用Terrence Parr

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

    因此,对于阶段1,2和3,您将使用ANTLR,
    对于AST转换,如果需要,您使用字符串模板和
    对于第4和第5阶段,您可以使用Javac .

    这只是一个开始,你有很多研究要做的漫长的旅程 . 我建议你一路上记下大量的笔记 .

相关问题