一、词法分析
1.1 名词解释
- 正规表达式:正规表达式是说明单词的pattern的一种表示法(记号),是定义正规集的工具。
- 正规文法:略
- 算符文法:即它的任一产生式的右部都不含两个相继的非终结符的文法。
- 算符优先文法:如果G是一个不含空字符的算符文法,那么只要它的任一对终结符都只满足>,<,=的关系的一种,则称G是一个算符优先文法。
- 非确定有限自动机的主要特点:一个状态的不同输出边可标有相同符号。这时在给定状态和符号的情况下,不能确定下一个状态,因此称之为非确定的。
- 两个状态等价的条件:
一致性条件:状态s和t必须同时为可接受状态或不可接受状态
蔓延性条件:对于所有输入符号,状态s和t必须转换到等价的状态里。
1.2 表达式之间的转换
(1)正则表达式->正则文法
- A->xy => A->xB B->y
- A->x*y => A->xB A->y B->xB B->y
- A->x|y => A->x A->y
(2)正则文法->正则表达式
- A->xB B->y => A->xy
- A->xA|y => A->x*y
- A->x A->y => A->x|y
2、消除左递归
2.1 消除直接左递归
P->Pα|β => P->βP' P'->αP'|ε
2.2 消除间接左递归
先对非终结符排序,往前代换,出现直接左递归则进行处理;
将非终结符排序为P1,P2,…,Pn
FOR i=1 TO n DO {
FOR j= 1 TO i-1 DO {
若Pj的所有产生式为: Pj→δ1|δ2|…|δk 把形如Pi → Pjγ的规则改写为:
Pi → δ1γ | δ2 γ |…| δk γ
}
消除Pi中的一切直接左递归
}
化简文法, 删除无用产生式
G: (1) S→Qc|c (2) Q→Rb|b
(3) R→Sa|a
排序: R、Q、S
G2: S→(abc|bc|c)S′S'→abcS′|ε
Q→Sab|ab|b (无用产生式)
R→Sa|a (无用产生式)
排序: S、Q、R
G1: S→Qc|c
Q→Rb|b
R→(bca|ca|a)R'
R'→bcaR'|ε
二、语法分析
语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”,“语句”,“表达式”等。
词法分析的方法:
自顶向下:
- 确定分析
- 不确定分析
自底向上:
- 算符优先分析
- LR分析
1、确定的自顶向下分析LL(1)文法
1.1 FIRST集的构造规则
对于FIRST(A),
- 若A是终结符,则A∈FIRST(A)
- 若A->a......或A->ε,则a或ε属于FIRST(A)
- 若A->Y1Y2Y3......Yn , 若Yn之前的都可以推出ε,则(FIRST(Y1)-ε)∪......(FIRST(Yn)-ε)∈FIRST(A)
- 若A->Y1Y2......Yn都可以推出ε,则FIRST(Y1)∪FIRST(Y2)......∪FIRST(Yn)∪{ε}∈FIRST(A)
1.2 Follow集的构造规则
对于Follow(A)
- 若A的后面是终结符b,则b∈Follow(A)
- 若A后面是非终结符B,可以推出空或就是空,则用(FIRST(B)-{ε})∪Follow(S)
1.3 一些定义
(1)一个上下文无关文法是LL(1)文法的充分必要条件:
对每个非终结符A的两个不同产生式,A->α,A->β,满足:
SELECT(A->α)∩ SELECT(A->β)=∅
(2) 文法中不含左公共因子只是LL(1)文法的必要条件,而不是充分条件。
1.4 消除直接左递归和消除间接左递归
2、LR分析法
2.1 项目分类
- 移进项目
- 待约项目
- 归约项目
- 接受项目
S'->α·
、
3、算符优先分析
3.1FIRSTVT集和LASTVT集的求法
Firstvt和Lastvt是为了画算符优先关系表的(就是表里面填优先大于小于等于的那个)。
然后要注意他们可都是终结符的集合。
Firstvt
找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
A->a.......,即以终结符开头,该终结符入Firstvt
A->B.......,即以非终结符开头,该非终结符的Firstvt入A的Firstvt
A->Ba.....,即先以非终结符开头,紧跟终结符,则终结符入Firstvt
Lastvt
找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
A->.......a,即以终结符结尾,该终结符入Lastvt
A->.......B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt
A->.....aB,即先以非终结符结尾,前面是终结符,则a∪LASTVT(B)加入LASTVT(A)集
4.概念区分
4.1 短语 直接短语 句柄 素短语
- 短语:一个句型的语法树中,任一子树节点所组成的字符串都是该句型的短语
- 直接短语:当子树不包含更小的子树时,该子树节点所组成的字符串就是该句型的直接短语
- 句柄:最左直接短语
- 素短语:至少有一个终结符,而且除它之外不包含其他素短语
三、语法制导翻译和中间代码生成
四、代码优化
1、中间代码优化中局部优化都有那些技术?
- 合并已知量
- 删除公共子表达式
- 变量传递和无用赋值删除
五、填空题
1、一个LR分析器包括两部分:—————和————
2、计算机执行用高级语言编写的程序主要有两种途径:————和————
3、一个LR(1)的项目由两个部分组成:————和————
4、自上而下分析法采用———和————和————和————等四种操作。
5、LEX编译系统的功能是构造各种各样的————和————
6、通常把编译程序分为分析前端和综合后端两大阶段。词法、语法和语义分析是对源程序的————,中间代码生成、代码优化与目标代码的生成则是对源程序的————。
7、自底向上分析方法也称为:————分析方法。
8、一个LR分析器由三个部分组成————和————和————。
9、所谓SLR(1)是:————。
10、LL(K)文法中,L表示————,L表示————,K表示————。
11、程序语言的单词符号一般可以分为:——————————。
12、语法分析器的输入是————其输出是————。
13、所谓自顶向下分析法指:————。
14、一个名字的属性包括:————和————。
15、对于数据空间的存储分配,FORTRAN采用————策略,PASCAL采用————策略。
16、所位于优化是指:————。
17、从功能上说,程序语言的语句大体分为————语句和————语句两大类。
18、扫描器的任务是从————中识别出一个个————。
19、所谓最右推导是指:————。
20、语法分析常用的两类分析方法是————和————。
21、一个上下文无关文法所含四个组成部分是———— ———— ————和————。
22、中间代码生成过程中,所谓语法制导翻译方法是:————。
23、常用的两种动态存储分配方法是————动态分配和————动态分配。
24、产生式是定义————的一种书写规则。
25、编译程序与具体的机器————有关,与具体的语言有关。
1、总控程序 分析表
2、编译 解释
3、心 向前搜索符号
4、移进 归约 错误处理 接受
5、语言 词法分析程序
6、分析 综合
7、移进-归约
8、总控程序 分析表(分析函数) 分析栈(文法符号栈和状态栈)
9、是对LR(0)分析法中有冲突的状态向前看一个符号的分析方法。
10、从左到右扫描字符串 最左推导 向前看K个符号
11、基本字 标识符 常量 算符 界符
12、单词符号串 语法单位
13、从开始符号出发,向下推导句子。
14、类型 作用域
15、静态存储分配 动态存储分配
16、对程序进行各种等价代换,使得变换后的程序可以生成更高效的目标代码。
17、执行性 说明性
18、源程序 单词符号
19、任何一步α->β都是由α中的最右非终结符替换
20、自上而下 自下而上
21、一组非终结符 一组终结符 一个开始符号 一组产生式
22、为每一个产生式匹配一个翻译子程序,在进行语法翻译的同时,执行这些子程序。
23、栈式 堆式
24、语法范畴
六、简答类题
1、什么是编译程序?什么是解释程序?各有什么特点?
编译程序:把用高级设计语言书写的源程序,翻译成等价的计算机汇编语言或者机器语言书写的目标程序的翻译程序;
解释程序:高级语言翻译程序的一种,它将源语言(如BASIC)书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。
编译程序必须分析·源程序,然后综合目标程序。
2、何谓属性文法?
属性文法使文法符号属性值的计算和产生式相联系。随着语法分析的进行,执行属性值的计算,从而完成语义分析和翻译的任务。利用属性文法实现语义的语法制导翻译是对前后文无关文法的补充,即对文法中的每个产生式都附加一个语义动作或者语义子程序,且在语法分析过程中,每当需要使用一个产生式进行推倒或者归约时,语法分析程序除了执行相应的语法分析动作外,还要执行相应的语义动作或者调用相应的语义子程序,完成相应的语义分析和翻译工作。
3、何谓算符文法?何谓算符优先文法?
算符文法:它的 产生式的右部都不含两个的连续的非终结符的文法。如果G是一个不含空字符的算符文法,那么它的任一对终结符都只满足>,=,<的关系的一种,则称G是一个算符优先文法。
4、什么是规范推导?每个句型都有规范推导吗?每个句子都有规范推导吗?
规范推导就是最右推导。每个句子都有规范推导,而每个句型不一定有规范推导,比如采用非规范推导得到的句型。
5、“含有优化部分的编译程序执行效率高”,这种说法正确吗?为什么?
含有优化部分的编译程序。它优化的是生成的目标代码,而不是编译程序得到了优化,它提高的是目标代码的效率,为编译程序本身的效率并没有得到提高。所以以上说法不对。
6、编译程序的工作过程一般可以划分为哪几个阶段?同时还伴有那些处理?
编译程序的工作过程一般可以划分为:词法分析、语法分析、语义分析、中间代码生成、代码优化、同时还伴有表格处理和出错处理。前端和后端的划分依据为是否和目标机有关。