编译原理笔记
第一章:前言
1.1 编译程序的逻辑结构
- 词法分析:分析输入串如何构成句子,得到单词序列
- 语法分析:分析单词序列如何构成程序,构造语法分析树
- 语义分析:审查语义错误,为代码生成收集类型信息
- 中间代码生成
- 代码优化
- 目标代码生成
- 表管理、错误检查和处理贯穿整个过程

1.2 前端和后端
-
前端是指与源语言有关、与目标机无关的部分
如词法分析、语法分析、语义分析、中间代码生成、代码优化中与机器无关的部分
-
后端是指与目标机有关的部分
如代码优化中与机器有关的部分、目标代码的生成
1.3 遍的概念
遍是指从头到尾扫描一遍源程序
第二章:文法和语言
2.1 句型
若从文法的开始符号开始存在以下推导,则称为该文法的一个句型,句型中既可以包含终结符,也可以包含非终结符,也可以是空串
2.2 句子:
则称是该文法的句子
2.3 文法的分类:
-
0型文法,又称无限制文法、短语文法
-
1型文法,又称文有关文法
-
2型文法,又称上下文无关文法(Context-Free Grammar,CFG)
可用来构建语法树,语法树是上下文无关文法推导和规约的图形化表示
-
3型文法,又称正规文法(Regular Grammar,RG)
- 左线性文法
- 右线性文法

2.4 最左/右推导:
如果在推导的任何一步都是对产生式左部中的最左/右非终结符进行替换,则称为最左/右推导,其中最右推导也被成为规范推导
第三章:词法分析
3.1 正规文法转换成正规式

3.2 有穷自动机(FA)

-
确定的有穷自动机(DFA)
-
DFA的定义及组成

-
确定的含义:在状态转换的每一步,FA根据当前的状态及扫描的输入字符,便能唯一地知道FA的下一状态。
提示在状态转换图中的直观体现就是,在确定行表示的当前状态以及列确定的路径后,得到的目的状态不会是元素个数大于1的集合。
-
DFA的可接受以及接受集的定义:从开始状态开始,经过该符号串表示的路径,若能到达终态则称该符号串可被改DFA接受。

-
-
不确定的有穷自动机(NFA)
-
NFA的确定化,即将NFA转换为DFA(子集法)
步骤:
-
画出DFA转换表
提示转换表中在状态一列中,状态包含原NFA终态的集合要标*,代表其为等价DFA的终态
- 计算
- 计算
-
为转换表中的状态重命名
-
确定初态和终态
-
-
DFA的最小化(分割法)步骤如下:
提示考试时注意过程怎么写,下面使用需要三轮分割的列子演示步骤



在分割完成后,对可以化简的集合选出一个状态作为代表,删除其他多余状态,重新画图

3.3 正规式RE与有穷自动机FA的互相转化

3.4 正规文法RM与有穷自动机FA的互相转化

第四章:自顶向下语法分析方法
描述程序语法结构的规则可以使用2型文法(上下文无关语法,CFG)
语法分析方法包含确定的和不确定的分析方法,确定的语法分析方法根据输入符号,唯一选择产生式
确定的自顶向下分析方法:根据当前的输入符号唯一地确定选用哪个产生式替换相应的非终结符以往下推导

1. FIRST集的定义

2. Follow集的定义

FOLLOW集的求法可以按照下图技巧进行
- 若要求的非终结符是开始符号,则直接将#插入FOLLOW集中
- 在所有产生式的右部中找到要求的非终结符
- 看非终结符的右侧是什么元素
若无元素,则直接将该产生式左部的FOLLOW集加入到该非终结符的FOLLOW集中- 若为终结符,直接将该终结符加入到FOLLOW集中
- 若为非终结符,将FIRST(该非终结符)减去的所有终结符元素都加入至FOLLOW集中
