编译原理笔记——第一章

  1. 编译器有两个部分组成——分析部分和综合部分
    1.1 分析部分把源程序分解为多个组成要素,并在这些要素上加上语法结构,然后,它使用这个结构来创建该源程序的一个中间表示。分析部分会收集有关源程序的信息,并把信息存放在一个称为符号表的数据结构中。
    1.2 分析部分是编译器的前端,综合部分是编译器的后端
  2. 编译器结构
    2.1 词法分析(lexical analysis或scanning):读入组成源程序的字符流,并且将它们组织成为有意义的词素的序列,对于每个词素,词法分析器产生<token-name,attribute-value>的词法单元作为输出。在这个词法单元中,第一个分量token-name是一个由语法分析步骤使用的抽象符号,而第二个分量attribute-value指向符号表中关于这个词法单元的条目。符号表条目的信息会被语义分析和代码生成步骤使用。
    例如:position=initial+rate*60,这个赋值语句会经过如下过程的翻译:
    在这里插入图片描述
    2.2 语法分析(syntax analysis或parsing):使用有词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。
    2.3 语义分析(semantic analysis):使用语法树和符号表中的信息来检查源程序是否和语言定义的语义不一致,一个重要部分是进行类型检查
    (1) 收集标识符的属性信息:种属 (Kind),类型 (Type),存储位置、长度值,作用域 ,参数和返回值信息(参数个数、参数类型、参数传递方式、返回值类型)…
    在这里插入图片描述
    (2) 语义检查:
    变量或过程未经声明就使用
    变量或过程名重复声明
    运算分量类型不匹配
    操作符与操作数之间的类型不匹配
    数组下标不是整数
    对非数组变量使用数组访问操作符
    对非过程名使用过程调用操作符
    过程调用的参数类型或数目不匹配
    函数返回类型有误
    2.4 中间代码生成:在源程序的语法分析和语义分析完成之后,很多编译器生成一个明确的低级的或类机器语言的中间表示,该中间表示应该具有两个重要的性质:易于生成,且能够轻松地翻译为目标机器上的语言(到这里为前端)
    (1) 中间代码的表示方式:三地址码或语法树
    (2) 三地址码:
    在这里插入图片描述
    在这里插入图片描述

2.5 代码优化
2.6 代码生成:以源程序的中间表示形式作为输入,并把它映射到目标语言。编译器在中间代码生成或代码生成阶段做出有关存储分配的决定
2.7 符号表管理:记录源程序中使用的变量的名字,并收集和每个名字的各种属性(名字的存储分配,类型和作用域等)有关的信息
3 其他
3.1 环境是一个从名字到存储位置的映射。因为变量就是值内存位置(即C语言的左值),我们还可以换一种方法,把环境定义为从名字到变量的映射
3.2 状态是从一个内存位置到它们的值的映射,以C语言的术语来说,及状态把左值映射为它们相应的右值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值