编译原理基础
文法与语言描述
二型文法式子左边必须是非终结符,式子右边可以有多个字符。
给出生成下述语言的上下文无关文法(II 型):
三型文法式子左边只能有一个字符,而且必须是非终结符;式子右边最多有两个字符。如果有两个字符必须是终结符 + 非终结符的格式,如果是一个字符,那么必须是终结符。
给出生成下述语言的正规文法(III 型):
文法
描述的语言 是什么?
写一文法,使其语言是偶正整数的集合,要求不允许 0 开头。
句柄是直接短语中的,位居图最左的一个短语。
已知
,试给出表达式 的规范推导及语法树,并给出其短语、直接短语、句柄。

短语:
直接短语:
句柄:
正规式、NFA 与 DFA
设计一个 DFA,识别
的描述的正规集合。
- 构造该正规式所对应的 NFA;
- 将所求的 NFA 确定化;
- 将所求的 DFA 最小化。
DFA 转 NFA 主要靠“闭包 a”法(先取输入能到达的集合,再取空串能到达的集合,两结果合并)。
[S,A,B,G,F] [G,F] [A,B,C,G,F] [G,F] [G,F] [A,B,G,F] [A,B,C,G,F] [F,G,Z] [A,B,C,G,F] [A,B,G,F] [G,F] [A,B,C,G,F] [F,G,Z] [G,F] [A,B,G,F] 先将终态和非终态分成两个集:
, 对于 中的 3 态输入 a 则进入 集,而 1、2、4 态输入 a 仍然在 中,故 可一分为二 和 ;考察 对于 1、4 态输入 b 到达 3 态而 2 态输入 b 到达 4 态。故 可一分为二 , 。 其状态图如下:
LL(1) 文法
已知文法
,求:
- 消除左递归和回溯;
- 构造 FIRST、FOLLOW、SELECT 集合;
- 判断其是否是 LL(1) 文法;
- 构造 LL(1) 文法分析表;
- 分析 +a*a 是否是文法的句子。
First 元素即取右部的第一个终结字符;Follow 元素指的是左部符号在全局任意右部之后的终结字符,而不是 First 元素之后的元素;Select 元素指的是推导式中左部能推出的全部起始符号,如果右部为空则指向左部的 Follow 集合与右部的 First 集合(去掉空串)的并集。
因为
、 、 ,故该文法是 LL(1) 文法。 预测分析表为:
a + * # S S' F F' 符号串 +a*a 是否为句子的分析过程:
步骤 符号栈 S 输入串 规则 1 +a*a# 2 +a*a# 匹配 3 *a# 4 *a# 匹配 5 # , 5 # 成功,STOP
LR(0) 与 SLR(1) 文法
给定文法
,
- 判断该文法是否是 SLR(1) 文法;
- 若是,则构造其分析表;
- 对输入串 ab 进行分析。
拓广文法:
构造识别该文法所有规范句型活前缀的 DFA:

发现
存在移进-规约冲突。 因
,故 ,是 SLR(1) 文法。
ACTION 表示遇到终结符,GOTO 表示遇到非终结符;i 表示拓广文法里式子的序号,
构造 SLR(1) 分析表:

输入串 ab 分析过程:
