一、 基本框架
1.
程序编译的
6
步
词法分析
——
单词
语法分析
——
语法
语义分析
——
语义
中间代码生成
——
三地址、四地址码
代码优化
——
修改
目标代码生成
——
完成
2.
编译程序的过程
首先要读取源程序的每一个( 字符 )识别出( 单词 )
——
词法分析
然后再识别出( 句子 )
——
语法分析
再分析每个句子的( 语义 )
——
语义分析
并翻译成中间代码。
——
中间代码生成
编译程序的工作过程一般可以划分为
词法分析、语法分析、语义分析、代码优化等几个基本阶段,
同时还会伴有 表格处理 和 出错处理 。
中间代码生成时所依据的是 语义规则
编译程序分两阶段工作,前阶段完成的工作是
:
词法分析、语法分析、语义分析和中间代码生成
3.
编译与解释
1.
区别:编译方式与解释方式的根本区别在于 是否生成机器代码
2.
计算机执行用高级语言编写的程序主要有两种途径:编译和解释
3.
解释程序和编译程序 是两类高级程序语言处理程序。
4
.与编译系统相比,解释系统
_____
。
D
. 比较简单 , 可移植性好 , 执行速度慢
二、文法
1.
句型和句子的区别:是否只有终结符的句型
1.
设
G
是一个给定的文法,
S
是文法的开始符号,如果
S→α(
其中
α
∈
(VN1+VT))
, 则
称
α
是该文 法的一个 句型。
2.
设
G
是一个给定的文法,
S
是文法的开始符号,如果
S→α(
其中
α
∈
V1)
, 则称
α
是
文 法的一个句子。
4
.设
G
是一个给定的文法,
S
是文法的开始符号,如果
S->x(
其中
x
∈
V*)
, 则称
x
是
文法
G
的一个 句型
S→α
α∈
(VN +VT)* ——
句型
α∈
VT* ——
句子
句型包含句子,只有终结符的句型为句子。
2.
四种文法
0
型
——
短语文法
1
型
——
上下文有关文法
2
型
——
上下文无关文法
3
型
——
正则文法
对应包含关系
3.
句柄
1.
基本概念
短语:非叶子节点——叶子节点形成语句 (深度为
n
)
直接短语:深度为
1
的短语
句柄:最左的直接短语
2.
考题
句柄是一棵给定语法树的最左直接短语。
在规范归约中,用句柄 来刻画可归约串。
对于文法
G
,仅含终结符号的句型称为 句子。
4.
其它(低频考点可跳过)
一个上下文无关文法
G
包括四个组成部分,
它们是:一组非终结符号,一组终结符号, 一个开始符号,以及一组 产生式
文法
G1
和
G2
等价是指
_____
。
G1
和
G2
所识别的
(VT)*
相等
文法
G
产生的
_____
的全体是该文法描述的语言。
D
.句子
三、词法分析
词法分析基于 正则文法 进行的,即识别的单词是该类文法的句子。
词法分析的任务是 识别单词
词法分析器的输出结果是 单词的种别编码和自身值
扫描器是( 词法 )分析器,它接受输入的( 源程序 ),对源程序进行( 词法分析)并
识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。
自动机所完成的任务是从字符串形式的源程序中识别出一个个具有独立含义的最小语法单
位即是 单词
词法分析器接受输入的源程序,对 源程序 进行逐个字符识读并识别出一个个单词符号,其
输出结果是单词符号,以一个 整数 的形式表示。
四 、语法分析
1.
语法分析的类型
1
)自顶向下语法分析
禁止:不允许任一非终结符有间接 左递归的产生式。
2
)自底向上语法分析
分析的关键:寻找句柄
对应操作:移进 、归约、错误处理、接受
.2.
其它知识点
在语法分析处理中,
FIRST
集合、
FOLLOW
集合、
SELECT
集合均是 终结符集
语法分析的数学模型是语法树
语法分析器调用词法分析器,并接受词法分析器返回的一个个单词,
对 单词 进行逐个逐个类型识别, 检查这些单词能否构成一个 句子
五 、语义分析和中间代码
综合属性:
自下而上传递信息(仅使用综合属性的属性文法称
S
-属性文法)
语法规则:根据右部候选式中的符号的属性计算左部被定义符号的综合属性
语法树:根据子结点的属性和父结点自身的属性计算父节点的综合属性
继承属性
:自上而下传递信息(仅使用继承属性的属性文法称L-属性文法)
语法规则:根据右部候选式中的符号的属性和左部被定义符号的属性计算右部候选式中的
符号的继承属性
语法树:根据父结点和兄弟节点的属性计算子结点的继承属性。
例:
1
)综合属性是用于
“
自下而上
”
传递信息。
( × )
2
)给出下面表达式的逆波兰表示
(
后缀式
)
:
a*(b+c)
后缀式:
abc+*
六、代码优化、目标代码生成
优化目的:节省时间和空间
优化分类
循环优化
——
强度削弱 、删除归纳变量、代码外提
局部优化(基本块内的优化)
——
删除多余运算,删除无用赋值
全局优化
对编译程序而言,
输入数据是
——
源程序
输出结果是
——
目标程序
若源程序是用高级语言编写的
目标程序 是机器语言程序或汇编程序,
则其翻译程序称为 编译程序 。
代码生成阶段的主要任务是
_____
把中间代码变换成依赖具体机器的目标代码
二、题型举例
1
)单项选择题
1.
为了使计算机可以执行
Pascal
程序
,
需要有一个
Pascal
的
( )
A
编译软件
B
计算机
C
输入软件
D
编辑软件
( A )
2
、将编译程序分成若干个“遍”是为了
。
a
.提高程序的执行效率
b
.使程序的结构更加清晰
c
.利用有限的机器内存并提高机器的执行效率
d
.利用有限的机器内存但降低了机器的执行效率
( b )
3
、构造编译程序应掌握
。
a
.源程序
b
.目标语言
c
.编译方法
d
.以上三项都是
( d )
4
、
不可能是目标代码。
a
.汇编指令代码
b
.可重定位指令代码
c
.绝对指令代码
d
.中间代码
(d )
5
、词法分析器的输入是
。
a
.单词符号串
b
.源程序
c
.语法单位
d
.目标程序
( b )
6
、编译程序是对
。
a
.汇编程序的翻译
b
.高级语言程序的解释执行
c
.机器语言的执行
d
.高级语言的翻译
(
正确回答
:d )
7
.语法分析树的根是
( )
A
终结符号
B
非终结符号
C
开始符号
D
产生式
(
C )
8
、语法分析应遵循
。
a
.语义规则
b
.语法规则
c
.构词规则
d
.等价变换规则
( b )
9.
文法
G
:
S→xSx|y
所识别的语言是
。
a. xyx
b. (xyx)*
c. x
n
yx
n
(n
≥
0)
d. x*yx*
(
C
)
10.
文法
S -> ( L ) | a
L -> L , S | S
是(
)型文法
A 2 B 3 C 1 D 0
(
A
)
11.
文法
S -> 0 S 1 | 0 1
是(
)型文法
A 3 B 2 C 0 D 1
(
B
)
12
、如果文法
G
是无二义的,则它的任何句子α
。
a.
最左推导和最右推导对应的语法树必定相同
b.
最左推导和最右推导对应的语法树可能不同
c.
最左推导和最右推导必定相同
d.
可能存在两个不同的最左推导,但它们对应的语法树相同
(
A
)
13
、文法
G
:
E→E+T|T
T→T*P|P
P→(E)|I
则句型
P+T+i
的句柄和最左素短语为
。
a.P+T
和
i
b. P
和
P+T c. i
和
P+T+i d.P
和
T ( b )
14 .
产生正规语言的文法为
。
a. 0
型
b. 1
型
c. 2
型
d. 3
型 (
D
)
15
对文法
E -> E + T | T
T -> T * F | F
F -> ( E ) | a | b
和符号串
(a+b)
构造最左推导
,
从开始符号一步推导得到的句型是
( )
A E + T B T C ( E ) D F
(
B
)
.
A
.
16.
语法分析的常用方法是
_________
:
(
B
)
①自顶向下 ②自底向上 ③自左向右 ④自右向左 可选项有:
a
、①②③④
b
、①②
c
、③④
d
、①②③
17.
采用自上而下分析,必须
。(
c
)
a.
消除左递归
b.
消除右递归
c.
消除回溯
d.
提取公共左因子
18.
在规范归约中,用
来刻画可归约串。
a.
直接短语
b.
句柄
c.
最左素短语
d.
素短语 (
b
)
19.
有文法
G
:
E→E*T|T
T→T+i|i
句子
1+2*6+4
按该文法
G
归约,其值为
。
A. 30 B. 17 C. 22 D. 21
20.
规范归约指
。(
b
)
a.
最左推导的逆过程
b.
最右推导的逆过程
c.
规范推导
d.
最左归约的逆过程
21.
下面的中间代码形式中,
能正确表示算术表达式
a+b*c
。
a
.
ab+c*
b
.
abc*+
c
.
a+b*c
d
.
ab*c+
(
b
)
22.
优化可生成
的目标代码。
(
d
)
a
.运行时间较短
b
.占用存储空间较小
c
.运行时间短但占用内存空间大
d
.运行时间短且占用存储空间小
2
) 填空题
1.
翻译程序是一个把
___________
翻译成等价的目标程序的程序
(
正确填空是 源程序
)
2.
文法中的终结符和非终结符的交集是
空集
。词法分析器交给语法分析器的文法符
号一定是
终结符
,它一定只出现在产生式的
右
部。
3.
最左推导是指每次都对句型中的
最左
非终结符进行扩展。
4.
在语法分析中,最常见的两种方法一定是
自上而下
分析法,另一是
自下而上
分析法。
5.
采用
自上而下
语法分析时,必须消除文法的左递归。
6.
如果用
digit
表示数字
,
那么描述整数的正规表达式是
( digit(digit)
*
)
7.
分析树的叶结点是(终结符号或者
)
9.
正规表达式
(0|1)
2
的集合是
( 00,01,10,11 )
10.
编译程序的分析工作指的是对源程序进行( 词法分析
)和语法分析和( 语义
)
分析
11.
结构分析程序包括( 词法分析
)和
(
语法分析
)
12.
词法分析程序把构成源程序的(
字符序列
)转换为单词符号串
13.
编译程序通常包括词法分析,语法分析,语义分析,中间代码生成和代码生成等部分,
其中哪些部分可能是不必须的
(
中间代码生成
)
14
编译程序通常包括哪
5
部分
?
参考:词法分析,语法分析,语义分析,中间代码生成和代码生成等部分,?
15.
编译是指将一个用
(
源语言
)
表示的算法转换到一个等价的用目标机器语言表示的算法
16.
编译程序首先要识别出源程序中每个
(
单词
)
,然后再分析每个
(
句子
)
并翻译其意义。
17.
编译器常用的语法分析方法有
(
自底向上
)
和
(
自顶向下
)
两种。
18.
通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序
的
(
分析
)
,中间代码生成、代码优化与目标代码的生成则是对源程序的
(
综合
)
。
19.
程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即
(
静态
存储分配
)
方案和
(
动态存储分配
)
方案。
20.
对编译程序而言,输入数据是
(
源程序
)
,输出结果是
(
目标程序
)
。
21.
文法中的终结符和非终结符的交集是
。词法分析器交给语法分析器的文法符号一定
是
,它一定只出现在产生式的
部。
22.
后缀式
abc-/
所代表的表达式是
a/(b-c)
,表达式
(a-b)*c
可用后缀式
ab-c*
表示。
3
) 简答题
1.
语法分析器的作用是什么
?
2.
对什么文法可以使用自顶向下的分析方法
?
3.
语言是什么
?
4.
什么是文法
?
5.
一个文法
G
是
LL
(
1
)的两个条件是什么
参考:对于
A->
|
,First(
)
First(
)=
,
对于
A->
|
,First(
)
Follow(A)=
)
6.
什么是规范推导
7.
什么是规范归约
8.
对于算符文法的两个终结符号
a
和
b,
关系
a.>b
是否等价于
b<.a,
为什么
参考:不等价,因为与终结符号
a,b
在栈顶或输入指针指向的符号有关
)
9.
对于算符文法的两个终结符号
a
和
b,
关系
a.=b
是否等价于算术中
a.=b,
为什么
10.
解释上下文无关文法
一个
上下文无关文法
G
是一个四元式(
VT,VN,S, P
),其中:
●VT
是一个非空有限集,它的每个元素称为终结符号;
●VN
是一个非空有限集,它的每个元素称为非终结符号,
VT∩VN=Φ
;
●S
是一个非终结符号,称为开始符号;
●P
是一个产生式集合(有限),每个产生式的形式是
P→
α,其中,
P
∈
VN
,
α∈
(VT
∪
VN)*
。开始符号
S
至少必须在某个产生式的左部出现一次。
11.
代码优化有哪些方法?
参考:
(
1
)删除多余运算
(
2
)代码外提
(
3
)强度削弱
(
4
)变换循环控制条件
(
5
)合并已知量与复写传播
(
6
)删除无用赋值
12.
编译程序和高级语言有什么区别
?
用汇编语言或高级语言编写的程序,必须先送入计算机,经过转换成用机器 语言表示的目
标程序(这个过程即编译),才能由计算机执行。执行转换过程 的程序叫编译程序。
汇编程序是指没有编译过的汇编语言源文件。编译程序转 换过的叫目标程序,也就是机器
语言。
编译程序的工作情况有三种:汇编型、解释型和编译型。汇编型编译程序用来 将汇编语言
编写的程序,按照一一对应的关系,转换成用机器语言表示的程序。
解释型编译程序将高级语言程序的一个语句,先解释成为一组机器语言的指令, 然后立即
执行,执行完了,取下一组语句解释和执行,如此继续到完成一个程序 止。
用解释型编译程序,执行速度很慢,但可以进行人和计算机的对话,随时 可以修改高级语
言的程序。
VB
语言就是解释型高级语言。编译型编译程序将 级语言编写的程序,一次就
会部翻译成机器语言表示的程序,而且过程进行很快, 在过程中,不能进行人机对话修改。
C
语言就是编译型高级语言。
13.
编译程序的工作分为那几个阶段
?
词法分析、语法分析和语义分析是对源程序进行的分析
(
称为编译程序的前端
)
, 而中
间代码生成、代码优化和代码生成三个阶段合称为对源程序进行综合
(
称为 编译程序的后
端
)
,它们从源程序的中间表示建立起和源程序等价的目标程序。
14.
简述自下而上的分析方法。
所谓自下而上分析法就是从输入串开始,逐步进行“归约”,直至归约到文法的 开始
符号;或者说从语法树的末端开始,步步向上“归约”,直到根节点。
15
.简述代码优化的目的和意义。
代码优化是尽量生成“好”的代码的编译阶段。也就是要对程序代码进行 一种等价变
换,在保证变换前后代码执行结果相同的前提下,尽量使目 标程序运行时所需要的时间短,
同时所占用的存储空间少。
16.
什么是句柄?什么是素短语?
一个句型的最左直接短语称为该句型的句柄。
素短语是这样的一个短语,它至少包含一个终结符并且不包含更小的素短语。
17
.
解释归约和推导
归约:我们称
αγβ
直接归约出
αAβ
,仅当
A→γ
是一个产生式,且
α
、
β
∈
(VN
∪
VT)*
。归约过程就是从输入串开始,反复用产生式右部的符号替换成产生式左部符号,
直至文法开始符。
推导:我们称
αAβ
直接推出
αγβ
,即
αAβ
αγβ
,仅当
A→ γ
是一个产生式,且
α
、
β
∈
(VN
∪
VT)*
。如果
α1
α2
…
αn
,则我们称这个序列是从
α1
至
α2
的一个推导。
若存在一个从
α1αn
的推导,则称
α1
可推导出
αn
。推导是归约的逆过程。
18.
划分程序的基本块时,确定基本块的入口语句的条件是什么?(
11
章例题)
解答:
(
1
)程序第一个语句,或
(
2
)能由条件转移语句或无条件转移语句转移到的语句,或
(
3
)紧跟在条件转移语句后面的语句。
4
)基本应用题
1.
消除下面文法的左递归
S -> ( L ) | a
L -> L , S | S
参考:
S -> ( L ) | a
L -> , S L
'
L
'
-> S L
'
|
ε
)
2.
构造正规式 1(0|1)*101 相应的 DFA.
解:
a
a,b
b b
图
3-6-5 DFA M
′
0
2
1
3.
设
M
=(
{x,y}, {a,b}, f,x,{y}
)为一非确定的有限自动机,其中
f
定义如下:
f
(
x,a
)=
{x,y}
f
(
x,b
)=
{y}
f
(
y,a
)=φ
f
(
y,b
)=
{x,y}
试构造相应的确定有限自动机
M
′。
解答:对照自动机的定义
M=(S,Σ,f,S
0
,Z)
,由
f
的定义可知
f(x,a)
、
f(y,b)
均为多值函数,所
以是一非确定有限自动机,先画出
NFA M
相应的状态图,如图
A
所示。
用子集法构造状态转换矩阵表
A
所示。
I
I
a
I
b
{x}
{x,y}
{y}
{y}
—
{x,y}
{x,y}
{x,y}
{x,y}
将转换矩阵中的所有子集重新命名而形成表
B
所示的状态转换矩阵。
表
B
状态转换矩阵
a
b
0
2
1
1
—
2
2
2
2
即得到
M′=
(
{0,1,2}, {a,b}, f,0, {1,2}
),其状态转换图如图
B
所示。
将图C的
DFA M′
最小化。首先,将
M′
的状态分成终态组
{1
,
2}
与非终态组
{0}
;其次,考
察
{1,2}
。由于
{1,2}a={1,2}b={2}
⊂
{1,2}
,所以不再将其划分了,也即整个划分只有两组
{0}
,
{1,2}
:令状态
1
代表
{1,2}
,即把原来到达
2
的弧都导向
1
,并删除状态
2
。最后,得到如图
以
C
所示化简
DFA M′
。
4.
对于文法
G[S]
:
a a
b
b
b
图
A NFA M
X
Y
a
a,b
b
图
C
化简后的
DFA M
′
0
1
S
(
L
)
L
,
S
S ( L )
S
a
图
---
句型(
S,
(
a
))的语法树
S
→(
L
)
|aS|a L
→
L, S|S
(
1
)画出句型(
S,
(
a
))的语法树。(
2
)写出上述句型的所有短语、直接短语、句
柄和素短语。
解答】
(
1
)句型(
S,
(
a
))的语法树如右图所示
(
2
)由图可知:
①短语:
S
、
a
、
(a)
、
S,(a)
、
(S,(a))
;
②直接短语:
a
、
S
;
③句柄:
S
;
④素短语:素短语可由图
6-A
终结符之间的优先关系求得,即;
因此素短语为
a
。
5.
对于文法
G[S]
:
S
→
1A | 0B | ε
A
→
0S | 1AA
B
→
1S | 0BB
⑴
(
分
)
请写出三个关于
G[S]
的句子;
⑵
(
分
)
符号串
11A0S
是否为
G [S]
的句型?试证明你的结论。
⑶
(
分
)
试画出
001B
关于
G [S]
的语法树。
解答
.
(
1
) 三个
0
和
1
数量相等的串
(
2
)
S => 1A => 11AA => 11A 0S
(
3
)
6
.消除左递归
G[E]:
E
→
ET+ | ET- | T
T
→
TF* | TF/ | F
F
→
(E) | i
解:
E
→
TE’
E’
→
T+E’ | T-E |
ε
T
→
FT’
T’
→
F*T’ | F/T’ |
ε
F
→
(E) | i
7.
设文法
G[S]
:
S
→
BdA | aa
B
→
Sd
A
→
Bc
① 将此文法改写为
LL(1)
文法;
② 求文法的每一个非终结符的
FIRST
集合
和
FOLLOW
集合。
③ 构造相应的
LL(1)
分析表。
#
·(·,·( ·
a
· )· )·
#
解:① 消除左递归
S
→
aaS’
S’
→
dAS’ |
ε
B
→
Sd
A
→
Bc
②
非终结符
FIRST
FOLLOW
S
a
d
,
#
S’
d
,ε
d
,
#
B
a
c
A
a
d
,
#
③
a
d
c
#
S
S
→
aaS’
S’
S’
→
dAS’
S’
→ε
S’
→ε
B
B
→
Sd
A
A
→
Bc
5
) 综合应用题
1
.
设有语言
L={ α | α
∈
{0,1} +
,且
α
不以
0
开头,但以
00
结尾
}
。
⑴ 试写出描述
L
的正规表达式;
⑵ 构造识别
L
的
DFA
(要求给出详细过程,并画出构造过程中的
NDFA
、
DFA
的状态转换图,
以及
DFA
的形式化描述
)
。
解:
(
1
)正规表达式:
1(0|1) * 00
(
2
)第一步:将正规表达式转换为
NFA
第二步:将
NDFA
确定化为
DFA
:
造表法确定化(
3
分) 确定化后
DFA M
的状态转换表
(2
分
)
状态 输入
I 0
I 1
t
0
1
[S]
—
[A,D,B]
q
0
—
q
1
[A,D,B]
[D,B,C]
[D,B]
重新命名
q
1
q
2
q
3
[D,B,C]
[D,B,C,Z] [D,B]
q
2
q
4
q
3
[D,B]
[D,B,C]
[D,B]
q
3
q
2
q
3
[D,B,C,Z] [D,B,C,Z] [D,B]
q
4
q
4
q
3
DFA
的状态转换图(
3
分)
第三步:给出
DFA
的形式化描述
DFA M =
(
{
q
0 ,
q
1 ,
q
2 ,
q
3 ,
q
4 }, {0,1}, t,
q
0 , {
q
4 }
)
t
的定义见
M
的状态转换表。
2.
已知文法:
G[A]
:
A
→
aAa
|ε
(
1
)该文法是
LL
(
1
)文法吗?为什么?
(
2
)若采用
LL
(
1
)方法进行语法分析,如何得到该文法的
LL
(
1
)分析表?
(
3
) 若输入符号串“
aaaa
”,请给出语法分析过程。
解答:(
1
)因为产生式
A
→
aAa
|ε
有空产生式右部,而
FOLLOW(A)={#}
∪
FIRST(a)={a, #}
造成
FIRST(A)
∩
FOLLOW(A)={A,
ε
}
∩
{a, #}
≠
Ø
所以该文法不是
LL
(
1
)文法。
(
2
)若采用
LL
(
1
)方法进行语法分析,必须修改该文法。
因该文法产生偶数(可以为
0
)个
a
,所以得到文法
G
′[
A
]:
A
→
aaA
|ε
此时对产生式
A
→
aaA
|ε
, 有
FOLLOW(A)={#}
∪
FOLLOW(A)={#}
,因而
FIRST(A)
∩
FOLLOW(A)={a,
ε
}
∩
{#}=Ø
所以文法
G
′[
A
]是 LL(1)文法,按 LL(1)分析表构造算法构造该文法的 LL(1)分析表
如表 2-1 所示。
表 2-1 文法
G
′[
A
]的 LL(1)分析表
A
#
A
A
→
aaA
A
→
ε
(
3
)若采用
LL(1)
方法进行语法分析,对符号串“
aaaa
”的分析过程如表
2-2
所示。
表
2-2
对符号串“
aaaa
”的分析过程
步骤
分析栈
输入串
产生式
/
动作
1
#A
a a a a #
A
→
aaA
2
#A a a
a a a a #
匹配
3
#A a
a a a #
匹配
4
#A
a a #
A
→
aaA
5
#A a a
a a #
匹配
6
#A a
a#
匹配
7
#A
#
A
→
ε
8
#
#
接受
4
.构造以下基本块
G
的
DAG
:
(1) T0
∶
=3.14
(2) T1
∶
=2 * T0
(3) T2
∶
=R + r
(4) A
∶
=T1 * T2
(5) B
∶
=A
(6) T3
∶
=2 * T0
(7) T4
∶
=R + r
(8) T5
∶
=T3 * T4
(9) T6
∶
=R
–
r
(10) B
∶
=T5 * T6
5
.
循环语句的翻译
for I:=1 step 1 until N do
M:=M+1
参考:
100
I:=1
101
goto 103
102
I:=I+1
103
if I≤N goto 105
104
goto 108
105
T:=M+1
106
M:=T
107
goto 102
108
3. 给定文法
G[S]
:
S
→
SaA|a
A
→
AbS|b
⑴ 请构造该文法的以
LR(0)
项目集为状态的识别规范句型活前缀的
DFA
。
⑵
请构造该文法的
LR(0)
分析表。
⑶ 什么是
LR(0)
文法?该文法是
LR(0)
文法吗?为什么?
⑷ 什么是
SLR(1)
文法?该文法是
SLR(1)
文法吗?为什么?
解
:
⑴拓广文法:
G[S ′ ]: S ′→ S
⑴
S → SaA
⑵
S → a
⑶
A → AbS
⑷
A → b
⑸
化简后:
(1) T0:=3.14
(2) T1:=6.28
(3) T3:=T1
(4) T2:=R+r
(5) T4:=T2
(6) A:=6.28*T2
(7) T5:=A
(8) T6:=R-r
(9) B:=A*T6
该文法的以
LR(0)
项目集为状态的识别规范句型活前缀的
DFA
:
⑶
LR(0)
文法:该文法的以
LR(0)
项目集为状态的识别规范句型活前缀的
DFA
中没有冲
突状态。
该文法不是
LR(0)
文法
因为存在冲突状态:
I 4
和
I 7
⑷
SLR(1)
文法:该文法的以
LR(0)
项目集为状态的识别规范句型活前缀的
DFA
中有冲
突状态,冲突可用
FOLLOW
集解决。
但该文法不是
SLR(1)
文法。 因为
FOLLOW(S)={a,b,#}
,所以无法解决冲突