这份文档包含了《编译原理》课程第二章的相关作业题目及其参考答案,适用于需要巩固和检验学习效果的学生和教师。
1. 句型是指从文法的开始符号出发,通过一系列规则推导出的所有句子形式。句子是句型的一个实例,在这个序列中不再包含任何变量(非终结符),仅由终止单元组成。语言是由该特定文法规则生成的所有可能句子构成的整体集合。
2. 短语是在语法分析过程中,从某个符号出发遵循规则得到的字符串片段;直接短语则是最外层的、没有进一步扩展为其他成分的部分。句柄是指在进行归约操作时所识别出的那个可以直接替换为其产生式的左部符号(即非终结符)的具体短语。
3. 对于给定文法G[E],E->T|E+T|E-T, T->F|T*F|T/F 和 F->(E)|i。要证明E+T*F是该语法的一个句型,并找出所有短语、直接短语和句柄。
- 通过递归替换规则可以得出:从初始符号E开始,经过一系列推导可得到“E+T*F”。
E -> E + T
-> (这里用到的实例是) E-T + F
=> ((这里的另一个实例是) i - i * i)
- 短语和直接短语分析:
E+T, “T*F”, 和“i”都是该句型中的短语;其中,“E+T”与“T*F”作为最外层的未进一步扩展部分,即为直接短语。
- 句柄确定:在上述推导序列中,“E-T + F”的句柄是E(因为它被替换成了一个完整的表达式),而T * F中的句柄则是T*。
4. 现代编译器设计采用的语法分析方法主要分为两大类:
- 自顶向下法:其基本思想是从文法开始符号出发,逐步递归地分解输入字符串直至匹配终结符。关键问题是避免出现回溯和二义性问题。
- 自底向上法(或称自下而上):这种方法从输入的最左侧字符开始尝试与产生式右侧相匹配,并逆向寻找能推导出该部分子串的非终止符号,从而构建语法树。其关键在于如何有效地识别并处理句柄。
5. 构造一个文法来生成正偶数集合(且不允许0开头):
S -> 2A | 4A | 6A | 8A
A -> B1|B3|B5|B7|B9
B -> C0 |C1 |...|C9
C->ε (空串)