编译原理笔记-01绪论

什么是编译

  • 编译就是将高级语言翻译成汇编语言或机器语言的过程。
  • 高级语言也叫源语言,汇编或机器语言叫目标语言

编译系统的结构

词法分析概述

词法分析就是从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。将识别出的单词转换成统一的机内表示——词法单元(token)形式

token:<种别码,属性值>

  • 种别码:表示单词的种别,对应自然语言中的词性。
  • 属性值:由于标识符和常量不可能事先全部枚举,所以使用属性值来区别标识符和常量值。

  • 每个关键字都有一个种别码,所以叫一词一码。
  • 多个标识符公用一个种别码,用属性值区分不同的标识符,所以叫多词一码。
  • 每个常量类型都有一个种别码,用属性值区分同一类型的不同常量。
  • 运算符界限符与关键字类似,事先可以全部枚举,所以一词一码。也可以是一个运算符的类型一个种别码,用属性值区分同一类型的不同运算符。

语法分析概述

语法分析就是从词法分析器输出的token序列识别出各类短语,并构造语法分析树(parse tree)。

语法分析树描述用来描述句子的语法结构

【例1】赋值语句的语法分析树

【例2】变量声明语句的分析树

文法就是一系列的规则

  • D:declaration,声明
  • T:type,类型
  • IDS:Identifier sequence,标识符序列

第一条规则表示一条声明语句是由一个类型T连接一个标识符序列IDS和一个分号构成的。

第二条规则表示类型T可以是int或real或char或bool。

第三条规则表示一个标识符id本身可以构成一个标识符序列。或者一个标识符序列连接一个逗号和一个标识符id可以构成一个更大的标识符序列。

从上图的语法树可以看出:一个标识符id本身可以构成一个标识符序列IDS;IDS连接一个逗号和一个标识符id可以构成一个更大的标识符序列;一个类型T连接一个标识符序列IDS和一个分号可以构成一个声明语句D。

语义分析概述

收集标识符的属性信息

高级语言程序中的语句大体可分为两种:声明语句和执行语句。在声明语句中会声明一些数据对象和过程,并对其分别起一个名字,这些名字也叫标识符。

对于声明语句来说,语义分析的任务就是收集标识符的属性信息

标识符的属性信息有

  • 种属(Kind):简单变量、复合变量(数组、记录、……)、过程、……
  • 类型(Type):整型、字符型、布尔型、指针型、……
  • 存储位置、长度
  • 变量值
  • 作用域
  • 参数和返回值信息

语义分析阶段得到的标识符的属性信息存放在符号表中。

符号表通常带有一个字符串表,字符串表用来存放程序中用到的标识符和字符常数,这样的话符号表中NAME字段就可分为两部分,一部分用来存放标识符在字符串表中的起始位置,另一部分用来存放标识符的长度

语义检查

语义分析的另一个任务是语义检查

常见语义错误

中间代码生成

常用的中间表示形式

  • 三地址码
    • 三地址码由类似于汇编语言的指令序列组成,每个指令最多有三个操作数
  • 语法结构树/语法树

注意:这里的语法树与前面语法分析的语法树不是一回事。

常用的三地址指令

三地址指令的表示

  • 四元式
  • 三元式
  • 间接三元式

三地址指令的四元式表示

四元式形式中第一个分量为操作符,第二和第三个分类为源操作数,第四个分量为目标操作数。

【例】中间代码的生成

输入一个程序片段,编译得到分析树和中间代码

j:jump,跳转指令

目标代码生成

目标代码生成就是以源程序的中间表示形式作为输入,并把它映射到目标语言

目标代码生成的一个重要任务就是为程序中使用的变量合理分配寄存器

代码优化

代码优化是进行等价程序变化,使其运行更快,占用空间更少

机器无关代码优化是在中间代码层面优化;机器相关代码优化是在目标代码层面优化。

优化包括识别并删除代码中的重复运算或者冗余运算、将代价较高的运算替换为等价的代价较低的运算等。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编译原理作业。 实验:词法分析 一、实验目的:编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、估计实验时间:1.课余准备15小时;2.上机二次4小时;3.完成实验报告5小时。 三、实验过程和指导: (一)准备:1.阅读课本有关章节,花一周时间明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。2.初步编制好程序。3.准备好多组测试数据。 (二)上课上机:将源代拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 如源程序为C语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如右图。 要求: 识别保留字:if、int、for、while、do、return、break、continue 其他的都识别为标识符; 常数为无符号整形数; 运算符包括:+、-、*、/、=、>、=、<=、!= 分隔符包括:,、;、{、}、(、) 以上为参考,具体可自行增删。 保留字为1 标识符为2 数字为3 运算符为4 分割府为5 程序思路(仅供参考): 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将源程序全部输入到字符缓冲区中。 2.取单词前:去掉多余空白。 3.取单词后:去掉多余空白(可选,看着办)。 4.取单词:读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?) 5.显示结果。 (四)练习该实验的目的和思路: 程序开始变得复杂起来,可能是大家以前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。因此要认真把握这个过渡期的练习。程序规模大概为200行。本实验和以后的实验相关。通过练习,掌握对字符进行灵活处理的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熠熠晨曦_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值