【习题答案】第05章 自底向上的语法分析
自底向上语法分析
E E E
E + id *
E id
6
id
动作
栈
输入缓冲区
1) # id1+id2*id3# 例5.2 分析过程 2) 移进 #id1 +id2*id3# 3) 归约 E→id #E +id2*id3# E 4) 移进 #E+ id2*id3# 5) 移进 #E+id2 *id3# 6) 归约 E→id #E+E *id3# E 7) 8) 9) 移进 移进 归约 E→id #E+E* #E+E*id3 #E+E*E id3# # # # #
E E
E
E
E
* id
10
10) 归约 E→E*E #E+E 11) 归约 E→E+E #E 12) 接受
2014-6-13
id + id
移进-归约分析中的问题
1) 移进归约冲突 – 例5.2中的 6)可以移进 * 或按产生式 E→E+E归约 2) 归约归约冲突 – 存在两个可用的产生式 • 各种分析方法处理冲突的方法不同 • 如何识别句柄?
第5章 自底向上语法分析
5.1.1 移进-归约分析
•系统框架
–采用表驱动的方式实现 –输入缓冲区:保存输入符号串 –分析栈:保存语法符号—已经得到的那部 分分析结果 –控制程序:控制分析过程,输出分析结 果——产生式序列 –格局:栈+输入缓冲区剩余内容=“句型”
2014-6-13 2
移进-归约语法分析器的总体结构
23
例5.7 E→E+T|E-T|T T→T*F|T/F|F F→(E)|id, 试利用算符优先分析法对id+id进行分析
第五章 语法分析-自底向上分析方法
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
Stack
LR分析模型
LR分析表
Action矩阵:行代表状态,列代表输入 符,而矩阵元素则表示相应的分析动作: Shift / Reduce / Accept / Error 。 GoTo矩阵:行代表状态,而列则代表语 法符号(非终极符,终极符),而矩阵 元素则表示移入或归约后的转向状态。 定义 若IS是一个LR(0)项目集,X是一个 文法符号,函数GO(IS, X)定义为 GO(IS, X)=CLOSURE(IS(X)),其中 IS(X)为LR(0)项目集IS的投影。
id
E→E+ T T→ id T→ (E)
E
7
S→E $ E→E +T
+
T→(E ) E→E +T
$
2 4
T
8
)
T→(E)
S→E $
E→E+T
GE的LRSM
LRSM给出了所有的可归活前缀
LRSM中的每个状态将对应一个饱和项目集: (1)其中一部分是由先驱状态分出来 (称为基本项目); (2)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
识别规约活前缀的LRSM的构造
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
编译原理第二版第五章答案
第五章第5章自顶向下语法分析方法练习(P99)1.文法S->a|^|(T)T->T,S|S(1) 对(a,(a,a)和(((a,a),^,(a)),a)的最左推导。
(3)经改写后的文法是否为LL(1)的?给出它的预测分析表。
(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
(1) 对(a,(a,a)的最左推导为:S=>(T)=>(T,S) =>(S,S) =>(a,S) =>(a,(T)) =>(a,(T,S)) =>(a,(S,S))=>(a,(a,S)) =>(a,(a,a))对(((a,a),^,(a)),a) 的最左推导为:S=>(T) =>(T,S) =>(S,S) =>((T),S) =>((T,S),S) =>((T,S,S),S)=>((S,S,S),S) =>(((T),S,S),S) =>(((T,S),S,S),S) =>(((S,S),S,S),S)=>(((a,S),S,S),S) =>(((a,a),S,S),S) =>(((a,a),^,S),S) =>(((a,a),^,(T)),S) =>(((a,a),^,(S)),S) =>(((a,a),^,(a)),S) =>(((a,a),^,(a)),a)(3)改写文法为:0) S->a1) S->^2) S->( T )3) T->S N4) N->, S N5) N->ε对左部为N2的产生式可知:FIRST (->, S N2)={,}FIRST (->ε)={ε}FOLLOW (N2)={)}{,}∩ { )}=Ø所以文法是LL(1)的。
也可由预测分析表中无多重入口判定文法是LL(1)的。
编译原理复习题及答案
编译原理复习题及答案一、选择题1.一个正规语言只能对应(B)A一个正规文法B一个最小有限状态自动机2.文法G[A]:A→εA→aBB→AbB→a是(A)A正规文法B二型文法3.下面说法正确的是(A)A一个SLR(1)文法一定也是LALR(1)文法B一个LR(1)文法一定也是LALR(1)文法4.一个上下文无关文法消除了左递归,提取了左公共因子后是满足LL(1)文法的(A)A必要条件B充分必要条件5.下面说法正确的是(B)A一个正规式只能对应一个确定的有限状态自动机B一个正规语言可能对应多个正规文法6.算符优先分析与规范归约相比的优点是(A)A归约速度快B对文法限制少7.一个LR(1)文法合并同心集后若不是LALR(1)文法(B)A则可能存在移进/归约冲突B则可能存在归约/归约冲突C则可能存在移进/归约冲突和归约/归约冲突8.下面说法正确的是(A)ALe某是一个词法分析器的生成器BYacc是一个语法分析器9.下面说法正确的是(A)A一个正规文法也一定是二型文法B一个二型文法也一定能有一个等价的正规文法10.编译原理是对(C)。
A、机器语言的执行B、汇编语言的翻译C、高级语言的翻译D、高级语言程序的解释执行C.FORTRAND.PASCAL11.(A)是一种典型的解释型语言。
A.BASICB.C12.把汇编语言程序翻译成机器可执行的目标程序的工作是由(B)完成的。
A.编译器B.汇编器C.解释器D.预处理器13.用高级语言编写的程序经编译后产生的程序叫(B)A.源程序B.目标程序C.连接程序14.(C)不是编译程序的组成部分。
A.词法分析程序B.代码生成程序D.解释程序D.语法分析程序C.设备管理程序15.通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括(C)。
A.模拟执行器B.解释器C.表格处理和出错处理D.符号执行器16.编译程序绝大多数时间花在(D)上。
半导体生产中常用的薄膜试题答案
一、填空题1、在半导体生产中常用的薄膜可以分为、、三大类。
2、集成电路金属互连工艺中AlCu合金常用作解决铝互连中的问题。
3、集成电路传统的铝互连线结构中常采用TiN / Ti作为金属阻挡层,这种工艺的主要目的是为了解决问题。
4、在半导体生产中,绝缘介质薄膜常见的主要有等材料。
5、在半导体生产中,半导体薄膜常见的主要有等材料。
6、在半导体生产中,金属导电薄膜常见的主要有等材料。
7、绝缘介质材料的特性中,介电常数主要用来表征绝缘材料的性能,介电强度用来表示绝缘材料的性能。
8、二氧化硅作为杂质选择扩散的掩蔽层,所需要满足的条件为:。
二、简答题1、简述二氧化硅薄膜在半导体生产中的主要作用?2、金属导电膜在半导体生产中的主要作用?3、什么是铝的电迁移?产生的原因?解决的方法?4、什么是铝尖刺现象?产生的原因和解决的方法?一、课程性质《编译原理》是高等工科院校“计算机科学与技术”、“软件工程”、“信息安全”等专业的一门重要的必修专业基础课。
所含内容涉及学科抽象、理论、设计三个形态。
在学习编译原理所涉及的知识的同时,掌握问题求解的典型思路和方法,帮助学生从系统层面重新认识程序和算法。
二、课程目标本课程的教学目标是:通过学习该课程,使学生了解形式语言基本概念和术语、掌握词法分析、语法分析、语义分析及中间代码生成、代码优化、符号表管理、存储组织和分配及代码优化的基本原理和实现方法。
通过学习编译程序的构造原理和技术,将有助于深刻理解和正确使用程序设计语言。
除此以外,编译原理课程介绍的一些原理、方法和算法并不局限于编译器的构造,也广泛地应用于其他软件的设计与开发。
本课程具有思想素质、知识技能以及能力培养三个层面的通用课程目标:(一)思想、素质教育目标目标1.1 在教学过程中,激发学生自豪感与爱国情怀,鼓励学生通过努力学习掌握先进科学技术,服务国家,回馈社会。
目标1.2 在教学过程中,通过课程内容与中国传统文化思想相结合,提升学生的学习兴趣、人文关怀和道德情操,真正做到“传道、授业和解惑”。
编译原理-清华大学-第5章-自底向上优先分析法(2+1)
第六章自底向上优先分析方法•教学要求:了解简单优先分折法,掌握算符优先分析法的关系表的构造以及分析过程。
•教学重点:算符优先表构造及算符优先分析法。
1自底向上分析法的基本思想•从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。
•工作方式:“移进-归约”方式。
2分析程序模型1)初态时栈内仅有栈底符“#”,读头指针在最左单词符号上。
2)语法分析程序执行的动作:a)移进读入一个单词并压入栈内,读头后移;b)归约检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号;c)识别成功移进-归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符;d)识别失败语法分析程序语法表a+b……#输出带#3例如:有文法如下(1)S→aAcBe(2)A→b(3)A→Ab(4)B→d问:语句abbcde是不是该文法的合法语句?4•例:设文法G(S):(1) S aAcBe(2) A b(3) A Ab(4) B d 试对abbcde进行“移进-归约”分析。
bbcde bbcde b cde de deabbcde eB cA a SB A a 5成功11接受2,3,4,1##S 10归约##aAcBe 9移进2,3,4e ##aAcB 8归约e ##aAc d 7移进de ##aAc 6移进2,3cde ##aA 5归约cde ##a Ab 4移进2bcde ##aA 3归约bcde ##a b 2移进bbcde ##a 1移进abbcde ##0动作输出带输入串栈步骤移进归约的分析过程G[S]:(1)S →aAcBe(2)A →b(3)A →Ab(4)B →d 6遇到的问题:(1)如何找出进行直接归约的简单短语?(2)找出的简单短语应直接归约到哪一个非终结符?关键:确定句柄.常用的分析方法:(1)优先分析法(2)LR分析法7b db ac eSA B A d b a c e S A B A d a c eSA B a c e A B S 没有语法树如何确定句柄?86.1 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
编译原理第5章 LL(1)文法及其分析程序
}
else error( )
}
}
27
5.2 预测分析程序(Predictive
parser)无回溯的自顶向下分析程序
特征——根据下一个(几个)输入符号为当前要处理 的非终结符选择产生式
要求——文法是LL(1)的 第一个L 从左到右扫描输入串 第二个L 生成的是最左推导 1 向前看一个输入符号(lookahead)
第5章 LL(1)文法及其分析程序
5.1 自上而下的语法分析 5.2 预测分析程序
递归下降子程序 表驱动的预测分析程序 5.3 LL(1)分析程序的生成
LL(1)文法 FIRST和FOLLOW集 定义和计算 5.4 非LL(1)文法的改造
1
5.1自上而下的语法分析
1语法分析概念 2自上而下的语法分析的一般过程 3自上而下的语法分析面临的问题
到分析结束。
5
分析算法分类
分析算法可分为:
自上而下分析法:
从文法的开始符号出发,寻找与输入符号 串匹配的推导,或者说,为输入串寻找一 个最左推导。
自下而上分析法:
从输入符号串开始,逐步进行归约,直至 归约到文法的开始符号。
6
两种方法反映了语法树的两种构 造过程。
自上而下方法是从文法符号开始,将它做为语法
SaASaSbASaabASaabbaSaabbaa
SaASaSbASaSbAaaabAaaabbaa
4
语法分析
在语言的编译实现中,把句子分析的过程称
为语法分析,即完成这个任务的程序称为 语法分析程序或称为识别程序。分析算法 又称识别算法。 从左到右的分析算法,即总是从左到右地识 别输入符号串,首先识别符号串中的最左 符号,进而依次识别右边的一个符号,直
编译原理课后习题答案
5-01.自底向上的语法分析方法的基本思想是:从给定的终极符串开始,根据文法的规则一步一步的向上进行
直接归约,试图归约到文法的 开始符号 。
5-02.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地向上进行 直接
归约 ,力求 归约 到文法的 开始符号 。
向貌似句柄的符号串后查看0个输入符号 。
5-05.在SLR(1)分析法的名称中,S的含义是 简单的 。
6-01.所谓属性文法是 一个属性文法是一个三元组:A=(G,V,F),一个上下文无关文法G;一个属性的
有穷集V和关于属性的断言或谓词的有穷集F。每个断言与文法的某产生式相联。
8-01.符号表中的信息栏中登记了每个名字的 属性和特征等有关信息 ,如类型、种属、所占单元大小、地址
等等。
8-02.一个过程相应的DISPLAY表的内容为 现行活动记录地址和所有外层最新活动记录的地址 。
9-01.一个过程相应的DISPLAY表的内容为 现行活动记录地址和所有外层最新活动记录的地址 。
1-29.按逻辑上划分,编译程序第二步工作是 C 。
A. 语义分析 B. 词法分析 C. 语法分析 D. 代码优化
c.机器执行效率 d.是否生成目标代码
1-12.汇编程序是将 a 翻译成 b ,编译程序是将 c 翻译成 d .
a.汇编语言程序 b.机器语言程序 c.高级语言程序
d. a 或者 b e. a 或者 c f. b 或者 c
1-21.编译程序是一种常用的 b 软件.
a. 应用 b. 系统
1-22.编写一个计算机高级语言的源程序后,到正式上机运行之前,一般要经过 b 这几步.
习题与答案-5-语法分析-自上而下
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1.对文法G[S]G: S →a | ∧| (T)T →T , S | S(1) 给出(a,(a,a))和(((a,a), ∧,(a)),a)的最左推导。
(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
1. [解答](1)①S ②S(T )( T )T , S T , S ②S=>(T) =>(T,S)=>(S,S) S ( T ) S a =>((T),S)=>((T,S),S)a T , S ( T ) =>((T,S,S),S)=>((S,S,S),S) S a T , S =>(((T),S,S),S)=>(((T,S),S,S),S)a T , S ( T ) =>(((S,S),S,S),S)=>(((a,S),S,S),S)①S=>(T) =>(T,S) S ^ S =>(((a,a),S,S),S)=>(S,S) =>(a,S) =>(((a,a),^,S),S) =>(a,(T)) ( T ) a =>(((a,a),^,(T)),S) =>(a,(T,S)) =>(((a,a),^,(S)),S)=>(a,(S,S)) T , S =>(((a,a),^,(a)),S)=>(a,(a,S)) =>(((a,a),^,(a)),a)=>(a,(a,a)) S aa(2) 消除左递归G': S→a | ∧| (T)T→ST'T'→,ST' |ε递归子程序:program parser proceduce T;begin begingetsym; if sym in [a,^,() thenS beginend; S;proceduce S; T;begin end;if sym=’a’ or sym=’^’ then elsegetsym error;elseif sym=’(‘ end;begin getsym; proceduce T’;T; beginIf sym=’)’ then if sym=’,’ thenGetsym; beginElse getsym;Error; S;End; T;Else end;Error; elseEnd; if sym=’)’ thenelseerror;end;LL(1)文法!(4) 分析栈余留串所用产生式或动作1 #S (a,a)# S—>(T)2 #)T( (a,a)# (匹配3 #)T a,a)# T—>ST’4 #)T’S a,a)# S—>a5 #)T’a a,a)# a匹配6 #)T’ ,a)# T’ —>,ST’7 #)T’S, ,a)# ,匹配8 #)T’S a)# S—>a9 #)T’a a)# a匹配10 #)T’ )# T’—>ε11 #) )# )匹配12 # # 接受因为(a,a)#分析成功所以(a,a)为文法的句子步骤分析栈余留串所用产生式或动作1 #S (a,a# S→(T)2 #)T( (a,a# ( 匹配3 #)T a,a# T→ST’4 #)T’S a,a# S→a5 #)T’a a,a# a 匹配6 #)T’,a# T’→,ST’7 #)T’S, ,a# , 匹配8 #)T’S a# S→a9 #)T’a a# a 匹配10 #)T’# 出错^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 2. G: E →TE'E' →+E |εT →FT'T' →T |εF →PF'F' →*F' |εP →(E) | a | b |∧预测分析表^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 3.已知文法G: S →MH | aH →LSo |εK →dML |εL →eHfM →K | bLM判断G是否是LL(1)文法,如果时,构造LL(1)分析表。
在自底向上的语法
在自底向上的语法一、什么是自底向上的语法自底向上的语法(Bottom-Up Parsing)是一种常用的语法分析方法,用于将一个字符串根据给定语法规则转化为语法分析树。
与之相对的是自顶向下的语法分析方法,自顶向下的语法分析从根节点开始,逐步将输入的字符串分解为非终结符和终结符,直到得到语法分析树。
而自底向上的语法分析则相反,它从叶子节点开始,逐步合并成非终结符,直到得到语法分析树。
自底向上的语法分析方法通常采用的是操作符优先分析法(Operator Precedence Parsing),也称为算符优先文法。
这种分析方法可以通过构造一个算符优先关系表来进行分析,从而判断字符串是否符合给定的语法规则。
自底向上的语法分析方法适用于各种类型的语言和文法,包括正则文法、上下文无关文法等。
这种方法具有较高的灵活性和适应性,并且能够处理大型复杂的文法和语言。
二、自底向上的语法分析步骤自底向上的语法分析过程可以分为以下步骤:1. 词法分析首先,将输入的字符串进行词法分析,将其划分为一个个单词或记号(Token)。
每个单词或记号都具有一个特定的含义,表示了输入字符串中的一个基本语义单元。
2. 初始化构建一个栈(Stack)用于保存已识别的单词或记号,并初始化一个语法分析表(Parsing Table)用于记录语法规则和操作符的优先级关系。
3. 移入操作从输入的字符串中读取一个未处理的单词或记号,并将其压入栈中。
4. 归约操作不断检查栈中的记号序列是否满足某一语法规则,如果满足,则将该记号序列替换为相应的非终结符,并执行相应的语义动作。
重复这个过程,直到不能再进行归约操作。
5. 接受或错误处理如果最终栈中只剩下一个元素,且该元素为起始符号,则语法分析成功,接受输入的字符串。
如果栈中无法进行归约操作,或者最终栈中还有多余的元素,或者无法匹配到输入字符串的所有部分,则语法分析失败,进行错误处理。
三、算符优先文法算符优先文法是自底向上分析方法的代表,它以操作符的优先级和关联性为基础,构造一个优先关系表来进行分析。
编译原理作业集-第五章-修订
第五章语法分析—自下而上分析本章要点1. 自下而上语法分析法的基本概念:2. 算符优先分析法;3. LR分析法分析过程;4. 语法分析器自动产生工具Y ACC;5. LR分析过程中的出错处理。
本章目标掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。
本章重点1.自下而上语法分析的基本概念:归约、句柄、最左素短语;2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:(1)LR(0)项目集族,LR(1)项目集簇;(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;(3)LR分析的基本原理,分析过程;4.LR方法如何用于二义文法;本章难点1. 句柄的概念;2. 算符优先分析法;3. LR分析器基本;作业题一、单项选择题:1. LR语法分析栈中存放的状态是识别________的DFA状态。
a. 前缀;b. 可归前缀;c. 项目;d. 句柄;2. 算符优先分析法每次都是对________进行归约:(a)句柄(b)最左素短语(c)素短语(d)简单短语3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。
a. LL(1)文法;b.二义性文法;c.算符优先文法;d.SLR(1)文法;4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。
a. 递归b. 回溯c. 枚举d. 移进-归约6. 一个LR(k)文法,无论k取多大,。
a. 都是无二义性的;b. 都是二义性的;c. 一部分是二义性的;d. 无法判定二义性;7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。
第5章+自底向上的语法分析
OPG优先关系的构造
1. 由算法构造算符优先关系 2. 由关系图构造算符优先关系(自学)
36
由算法构造算符优先关系 定义: FIRSTVT(B)={b|B=>+ b…,或B=>+ Cb…} LASTVT(B)={a|B=>+… a,或B=>+… aC} 构造优先关系: 1. ±关系:若有形如A→…ab… A→…aBb…的 产生式,则a ± b。 2. ≮关系:若有形如A→…aB…的产生式,b ∈ FIRSTVT(B),则a ≮b。 3. ≯关系:若有形如A→…Bb…的产生式,a 37 ∈ LASTVT(B),则a ≯ b。
7
自底向上分析方法的分类
寻找句柄的方法不同,就形成了不 同的自底向上分析方法。 优先分析法
简单优先分析法(句柄)
算符优先分析法(最左素短语)
LR分析法(句柄)
8
§5.2 短语、直接 短语及句柄
9
刻画“可归约串”
句型的短语 S =>* αAδ且 A =>+ β,则称β是句型αβδ 相对于非终结符A的短语。 句型的直接短语 若有A β,则称β是句型αβδ相对于非终 结符A 的直接短语。 句型的句柄 一个句型的最左直接短语称为该句型的句 柄。
直观算符优先分析法
为了易于理解算符优先分析法,先介绍 一种简单的算符优先分析法—直观算符优 先分析法。 四则运算的例子说明了运算的次序只与 运算符有关,而与运算对象无关。 因而直观算符优先分析法的关键是对一 个给定文法G,人为地规定其算符(终结符) 的优先关系,再根据任何两个可能相继出 现的终结符的优先关系对输入串进行归约。31
e
B A a S5
a
编译原理(3)语法_5(自底向上语法分析:LR和算符优先分析)
图3-23 优先函数关系图
表3.11 表3.7的优先函数表
+ f g 4 3
* 6 5
i 6 7
( 2 7
) 6 2
3.4
自底向上的语法分析
(2)直接定义法(参照图3-23)
由定义直接构造优先函数时,对每个终结符a(包括“#”),令 f(a) = g(a) = 1(也可以是其它整数),则:
重点掌握
算符优先关系表的构造
FirstVT集合
LastVT集合
3.4
自底向上的语法分析
3.4.1 自底向上分析原理
所谓自底向上分析,就是自左至右扫描输入串,自底向上进
行分析;通过反复查找当前句型的句柄(最左直接短语),并使 用产生式规则将找到的句柄归约为相应的非终结符。这样逐 步进行“归约”,直到规约至文法的开始符号; 或者说,从语法树的末端开始,步步向上“归约”,直到根 结点。 若能规约为文法的开始符号,则表示分析成功,说明输入符 号串是文法的合法句子,否则有语法错误。
西北农林科技大学本科教程
第 8 讲
主讲教师:赵建邦
第三章 语法分析
3.1 3.2
文法和语言 推导与语法树
3.3
3.4
自顶向下的语法分析
自底向上的语法分析
3.5
规范规约的自底向上语法分析方法
本讲目标
第三章《语法分析》
3.4
自底向上的语法分析
自底向上分析原理(规约) 算符优先分析方法
3.4
自底向上的语法分析
比较好的办法是先画一棵最右推导对应
例:文法G[S]:
S→aAbB
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课后练习参考答案
第05章 自底向上的语法分析
1. S→aS|bS|a
(1) 构造该文法的LR(0)项目集规范族。
(2) 构造识别该文法所产生的活前缀的DFA 。
(3) 构造其SLR 分析表,并判断该文法是否是SLR(1)文法。
【解】 构造LR(0)项目集规范族,有两种方法:一种是利用有限自动机来构造,另一种是利用函数CLOSURE 和GO 来构造。
本题采取第2种方法,通过计算函数CLOSURE 和GO 得到文法的LR(0)项目集规范族,而GO 函数则把LR(0)项目集规范族连成一个识别该文法所产生的活前缀的DFA 。
(1) 将文法G(S)拓广为G(S’):
(0)S’→S
(1)S→aS
(2)S→bS (3)S→a
构造该文法的LR(0)项目集规范族:
I 0=CLOSURE({S →·S})={S’ →·S, S→·aS, S→·bS, S→·a}
I 1=GO( I 0 , a)=CLOSURE({S→a·S , S→a·})={S→a·S , S→a· , S→·aS, S→·bS, S→·a } I 2=GO(I 0 , b)=CLOSURE({S→b·S })={ S→b·S, S→·aS, S→·bS, S→·a } I 3=GO(I 0 , S)=CLOSURE({S’ →S·})={ S’ →S·} GO(I 1, a)=CLOSURE({S→a·S , S→a·})=I 1 GO(I 2, b)=CLOSURE({S→b·S})=I 2
I 4=GO(I 1, S)=CLOSURE({S→aS·})={S→aS·} GO(I 2, a)= CLOSURE({S→a·S , S→a·})=I 1 GO(I 2, b)= CLOSURE({S→b·S})=I 2
I 5=GO(I 2, S)=CLOSURE({S→bS·})={ S→bS·}
所以,项目集I 0,I 1,I 2,I 3,I 4和I 5构成了该文法的LR(0)项目集规范族。
(2) 我们用GO 函数把LR(0)项目集规范族连成一个识别该文法所产生的活前缀的DFA 如下图所示。
(3) 构造其SLR 分析表。
SLR 分析表 ACTION
GOTO 状态 a b #
S 0 S1 S2 3 1 S1 S2 r3 4 2 S1 S2 5 3 acc 4 r1 5
r2
注意到状态I 1存在“移进-归纳”冲突,计算S 的FOLLOW 集合:FOLLOW(S) = {#} 可以采用SLR 冲突消解法,得到上表所列的SLR 分析表。
从分析表可以看出,表中没有冲突项,所以该文法是SLR(1)文法。
2. 构造识别下列文法的所有活前缀的DFA
S →A|B A →aAc A →a B →bBd B →b
【解】
(1) 构造拓广文法
0) S’ →S 1) S →A 2) S →B 3) A →aAc 4) A →a 5) B →bBd 6) B →b
(2) 识别该拓广文法的所有规范句型活前缀的DFA 项目集规范族
C={I0,I1,I2,I3,I4,I5,I6,I7,I8,I9}
I0={ S’→.S , S→.A, S→.B, A→.aAc, A→.a, B→.bBd, B→.b } I1={ S’→S. } I2={S→A.} I3={S→B.} I4={ A→a.Ac, A→a., A→.aAc A→.a} I5={B→b.Bd, B→b., B→.bBd, B→.b}
I6={A→aA.c} I7={B→bB.d} I8={A→aAc.} I9={B→bBd.}
(3) 识别该拓广文法的所有规范句型活前缀的DFA
→.B A →.aAc A →.a B →.bBd B →.b
3. 给定文法G: S → (L | a L → S, L | )
(1) 构造拓广文法及拓广文法的LR(0)项目集规范族(状态集合)。
(2) 构造这个文法的SLR (1)分析表。
【解】
(1) 构造拓广文法
0) S’ →S 1) S → (L
2) S → a 3) L → S, L
4) L → )
拓广文法的LR(0)项目集规范族(状态集合)
I0={S’ →.S, S →. (L, S →. a} I1={ S’ →S. }
I2={ S →(.L, L → .S, L , L →. ), S → .(L , S → .a } I3={ S →(L. }
I4={ S →S., L }
I5={ L →).} I6={ S → a.}
I7={ L → S, .L , L → .S, L , L → .)} I8={ L → S, L.}
其DFA 如下:
(2) 求各非终结符的 FISRT 集和 FOLLOW 集: FIRST(S) = { (, a } FIRST(L) = { ) } FIRST(S) = { (, ), a } FOLLOW(S) = { , , # }
FOLLOW(L) = FOLLOW(S) ={ , , # }
G 的SLR(1) 分析表:
( a , ) # S L
0 s2 s6 1
1 acc
2 s2 s6 s5 4
3 3 r1 r1
4 s7
5 r4 r4
6 r2 r2
7 s2 s6 s5 4
8 8
r3
r3
4. 证明AdBd 是文法G[S]的活前缀。
说明活前缀在LR 分析中的作用。
给出串dbdb#的LR
分析过程。
G[S]: (1) S→AdB
(2)A→a (3) A→ε (4) B→b (5)B→Bdb (6)B→ε
【解】 所谓活前缀是指规范句型的一个前缀,这种前缀不是句柄之后的任何符号。
根据此定义,直接证明AdBd 是文法G(S)的活前缀。
存在下面的规范推导:S => AdB => AdBdb ,可见AdBdb 是文法G 的规范句型,AdBd 是该规范句型的前缀。
另外,在该规范句型中Bdb 是句柄,前缀是AdBd 不含句柄Bdb 之后的任何符号,所以AdBd 是文法G(S)的活前缀。
在LR 分析工作过程中的任何时候,栈里的方法符号(自栈底而上)X 1X 2…X m 应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整个输入串确实构成一个句子)。
因此,只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误。
识别活前缀的DFA 如下:
构造文法G 的LR 分析表如下:
ACTION GOTO a d b # S A B 0 s3 r3 1 2 1 acc 2 s4 3 r2 4 r6 s5 r6 6 5 r4 r4 6 s7 r1 7 s8 8 r5 r5
串dbdb#的LR 分析过程如下:
步骤 状态 符号 输入串 0 0 # dbdb# 1 02 #A dbdb# 2 024 #Ad bdb# 3 0245 #Adb db# 4 0246 #AdB db# 5 02467 #AdBd b# 6 024678 #AdBdb # 9 0246 #AdB #
10 01 #S # acc。