Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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
Compiler construction 除了ANTLR之外,还有什么其他工具可以帮助我创建一个针对JVM的小型语言?_Compiler Construction_Antlr_Formal Languages_Ll - Fatal编程技术网

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

Compiler construction 除了ANTLR之外,还有什么其他工具可以帮助我创建一个针对JVM的小型语言?,compiler-construction,antlr,formal-languages,ll,Compiler Construction,Antlr,Formal Languages,Ll,(几天前我开始了我的ANTLR语言冒险。我对语言理论和编译器构造的知识非常有限。如果这不是一个有效的问题,请原谅。) ANTLR是一个解析器生成器,特别是一个ALL(*)解析器。根据,解析器是: 编译器中试图从语法上理解代码的部分 源代码 AFAIK编译器应包括5个阶段: 词汇分析 语法分析 语义分析 IL表示与优化 代码生成 所以ANTLR似乎只覆盖1和2 所以,如果我想为教育目的的语言编写一个编译器,它以JVM上的Java字节码为目标。对于第3-5阶段,我还可以利用哪些其他工具 加1 为什么

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

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

编译器中试图从语法上理解代码的部分 源代码

AFAIK编译器应包括5个阶段:

  • 词汇分析
  • 语法分析
  • 语义分析
  • IL表示与优化
  • 代码生成
  • 所以ANTLR似乎只覆盖1和2

    所以,如果我想为教育目的的语言编写一个编译器,它以JVM上的Java字节码为目标。对于第3-5阶段,我还可以利用哪些其他工具

    加1 为什么ANTLR只覆盖1和2?我想跳过4和5是因为它们太特定于目标平台。但是为什么ANTLR会跳过3?关于ADD1:

    ANTLR做了1)和2)因为这是为它定义的目标。作者认为你会很乐意从头开始编写任何编译器的“其余部分”

    我同意,我们需要走得更远。有一个巨大的问题

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

    一种更通用的工具是。这些工具允许您定义语法(与ANTLR类似),并将生成解析器,自动从源代码为该语言构建抽象语法树,提供修改这些AST的方法(通常是“源到源”的重写规则),最后预打印修改后的AST以生成等效的源代码输出

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

    我们将同时处理多种(包括“两种”)语言。您可以将源语言转换为目标语言,并预打印结果。因为源“+”节点与目标“+”节点不同,所以不存在混淆

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

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

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

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

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

    [旁注:可以使用Java前端获得DMS。这包括解析和处理JVM二进制代码的额外支持机制。这可以用于实现从后处理到JVM二进制的步骤。或者,您也可以自己滚动]


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

    既然你似乎在钻研ANTLR,我建议你购买一本
    ”“还有
    ”“是的

    对于第3-5阶段,我还可以利用哪些其他工具

    ANTLR的创建者也创建了可用于AST转换的工具,但还有其他工具填补了这一空缺。请参阅:。注意,爱尔兰共和军已经在他的回答中提到了DMS

    对于阶段3,语义分析,您可以使用ANTLR。参见:作为示例。本书还讨论了进行语义分析的其他方法

    对于阶段4-5,请阅读第10章,
    构建字节码解释器

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

    对于第4-5阶段的快速搜索,我在快速阅读后发现了这一点,因此我将提及这一点,但没有保证。简而言之,is用于第4-5阶段。因为博客是在Oracle上托管的,所以我认为只有Oracle Javac才能工作

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

    为什么ANTLR只覆盖1和2

    引用

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

    所以 对于阶段1、2和3,您需要