编译原理1

  

  语法分析的任务是将输入流构造成AST.

  程序文本输入模块用于找到程序文本文件,有效地读入它,同时在考虑换行符、转义符等不同类型字符的基础上
将它转换为字符流,若还包含其他文件,该模块可能会切换到其他文件,这一功能模块一方面需要与操作系统协调,
另一方面需要与词法分析程序沟通。

  词法分析模块用于在输入流中分离记号并且决定它们的类和表示。它可以手工生成或者从记号描述中生成。
另外,它也可以对某些记号做有限的解释,例如识别一个标示符是宏还是关键字(保留字)。

  语法分析模块用于将记号流转换为抽象语法树(AST)。有些语法分析程序包含两个模块。第一个读入记号流并为
每一个辨别出来的语法结构从第二个模块中调用一个函数;第二个模块中的函数构造AST节点并连接它们。这有一个优点,
即可以通过替换原来的AST生成模块,使得从同一个语法fenix程序中得到不同的AST,或者可以替换语法分析程序并从
不同的语言得到同一种AST。

  上下文处理模块用于从程序不同地方收集上下文信息,并用手机到的结果标注节点,例如:把从声明到表达式的
类型信息关联起来;在命令语言中,把goto语句和它们跳转的语句标号联系起来;在分布式语言中,判断哪个例程调用
是本地的哪个又是远程的,而这些注释随后用来执行上下文检验或者传递给后继模块。

  中间代码生成模块用于将AST中特定语言的结构翻译为更一般的结构,而这些更一般的结构构成中间代码(IC),判定
什么是特定语言的结构和什么事更一般结构取决于编译程序设计者,不过通常这种选择并不太难,判定中间代码好坏的
一个标准是能否从中间代码方便直接地为各种机器生成机器代码,中间代码通常仅仅包含表达式和控制流指令。

  中间代码优化模块用于执行中间代码的预处理,以提高代码生成模块的效率。一个简单的预处理的例子是恒定折迭,
它是吧表达式中已知的简单操作数的所有操作预先执行。内联是更复杂的例子,它把对例程的调用语句用这些例程
的函数体来替换,同时替换它们的参数。

  代码生成模块用于或多或少以符号形式将AST重写到目标机器指令的线性表中,最后,该模块为AST段选择指令,分配
寄存器来存储数据并且以正确的顺序安排指令。

  目标代码优化模块用于处理机器指令表,用更快或更短的指令序列替换原有的指令序列来达到优化目标机器指令的目的,
该模块使用了特定目标机器的属性。

  机器代码生成模块用于将符号机器指令转换为对应的位模式。它确定程序代码和数据的机器地址,并产生长了过程表
和重定位表。

  可执行代码输出模块用于将经过编码的机器指令、常量表、重定位表和头部、尾部以及操作系统需要的其他资料结合
成可执行代码文件。

原文地址:https://www.cnblogs.com/wangzhijun/p/3063904.html