编译原理 第二章习题

第二章复习题

单选

  1. 对于文法G[Z],已知u是句型,则判断(D)是正确的。
    A 只要使用规范推导,无论如何一定可以从Z推导出u
    B 只要依据产生式进行规范归约,则u一定可以归约成Z
    C 上面的A和B都是对的
    D 上面的A和B都是错的

  2. 由“非终结符–>符号串”这种产生式构成的文法是(C)。
    A 0型语法
    B 1型文法
    C 2型文法
    D 3型文法

  3. 二义文法是指(D)。
    A 对应于两棵不同语法树的文法
    B 对应于两种不同推导的文法
    C 文法中任何一个非终结符,都存在以它为左部的两个不同产生式
    D A、B、C都是错的

  4. 文法G[Z]和语言L(G[Z])存在如下关系:(C)。
    A 一一对应,一个文法对应唯一的语言,并且,一个语言对应唯一的文法
    B 一个语言对应唯一的文法,反之则不然
    C 一个文法对应唯一的语言,反之则不然
    D 若为非二义文法,则C正确;若为二义文法,则一个文法不对应唯一的语言

  5. 关于短语和句柄,正确的论述是(B)。
    A 短语就是句柄
    B 直接短语才可能是句柄
    C 最左短语一定是句柄
    D 最右短语一定是句柄

  6. 若一个文法是递归的,则它产生的句子个数是(A)。
    A 无穷个
    B 可能有限个,可能无穷个
    C 有限个

  7. 正则文法(A)二义性的。
    A 可以是
    B 一定不是
    C 一定是

  8. 一个语言的文法是(B)。
    A 唯一的
    B 不唯一的
    C 个数有限的
    D 无数个

  9. 文法识别符号经过人一步推导得到的结果是(A)。
    A 句型
    B 句柄
    C 句子
    D 短语

  10. 文法分为四种类型:0型文法、1型文法、2型文法、3型文法,其中3型文法是(B)。
    A 短语文法
    B 正规文法
    C 上下文有关文法
    D 上下文无关文法

  11. 在编译中产生语法树是为了(A)。
    A 语法分析
    B 语义分析
    C 词法分析
    D 目标代码生成

  12. 一个上下文无关文法包含四个部分,一组非终结符,一组终结符,一个开始符号以及一组(C)。
    A 句子
    B 句型
    C 产生式
    D 单词

  13. 自下而上的语法分析中,应从(C)开始分析。
    A 开始符号
    B 句柄
    C 句子
    D 句型

多选

  1. 如果一个文法是二义文法,必然有(ABCD)的现象存在。
    A 文法的某一个句子存在两颗或两棵以上的语法树
    B 对于文法的某一个句子,存在两种或两种以上的最左(最右)推导
    C 对于文法的某一个句子,存在两种或两种以上的最左(最右)规约
    D 在进行规约时,文法的某些规范句柄不唯一

  2. 给定语法A–>bAcc|ε,下面的符号串中为该文法的句子是(AE)。
    A bcc
    B bcbc
    C bcbcc
    D bccbcc
    E bbccc

简答

1.写出C语言和Java语言的输入字母表。

  • C语言:0~9数字,大小写英文字母,键盘上可见的字符
  • Java语言:Unicode可以包括的所有字符

2.文法 G G

N D N D N\to D|ND D 0 1 2 3 4 5 6 7 8 9 D\to 0|1|2|3|4|5|6|7|8|9
(1) G G 的语言是什么?

  • G G 的语言是:0~9的数字组成的任意非空串
    L ( G ) = { x x { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } + } L(G)=\{x|x\in \{0,1,2,3,4,5,6,7,8,9\}^{+}\}

(2)给出句子0127、34、568的最左推导1和最右推导。

  • 以句子0127为例
    最左推导:

N N D N\Rightarrow ND N D D \Rightarrow NDD N D D D \Rightarrow NDDD D D D D \Rightarrow DDDD 0 D D D \Rightarrow 0DDD 01 D D \Rightarrow 01DD 012 D \Rightarrow 012D 0127 \Rightarrow 0127

理解: N N D N\Rightarrow ND 是对 N N 中的最左非终结符 N N 进行了替换,替换成了 N D ND
N D N D D ND\Rightarrow NDD 是对 N D ND 中的最左非终结符 N N 进行了替换,替换成了 N D ND
后面的同理。

最右推导:
N N D N\Rightarrow ND N 7 \Rightarrow N7 N D 7 \Rightarrow ND7 N 27 \Rightarrow N27 N D 27 \Rightarrow ND27 N 127 \Rightarrow N127 D 127 \Rightarrow D127 0127 \Rightarrow 0127

理解: N N D N\Rightarrow ND 是对 N N 中的最右非终结符 N N 进行了替换,替换成了 N D ND
N D N 7 ND\Rightarrow N7 是对 N D ND 中的最右非终结符 D D 进行了替换,替换成了 7 7
后面的同理。

3.写一文法,使其语言是奇数集。要求:不以0打头。

  • 只有一位数的情况: D 1 3 5 7 9 D\to 1|3|5|7|9
  • 复杂的情况:分三部分
    末尾:以1|3|5|7|9结尾, D 1 3 5 7 9 D\to 1|3|5|7|9
    开头:除了0的任意数字, B 2 4 6 8 D B\to 2|4|6|8|D
    中间:空或者任意数字串, C C A ε C\to CA|\varepsilon
  • 最终答案:文法 G ( N ) G(N) 为: N B C D D N\to BCD|D D 1 3 5 7 9 D\to 1|3|5|7|9 B 2 4 6 8 D B\to 2|4|6|8|D C C A ε C\to CA|\varepsilon A 0 B A\to 0|B

4.证明文法: S i S e S i S i S\to iSeS|iS|i 是二义的2

首先:找到此文法对应的一个句子 i i i e i iiiei
然后:构造与之对应的两颗语法树

5.给出下面语言的相应文法

  • L 1 = { a n b n c i n 1 , i 0 } L_{1}=\{a^{n}b^{n}c^{i}|n\ge1,i\ge0\}
    n n i i 的不同区直来把 L 1 L_{1} 分成两部分:

    • 前半部分是 a n b n a^{n}b^{n} A a A b a b A\to aAb|ab
    • 后半部分是 c i c^{i} B B c ε B\to Bc|\varepsilon
      G 1 [ S ] G_{1}[S] 可以写为: S A B S\to AB A a A b a b A\to aAb|ab B c B ε B\to cB|\varepsilon
  • L 2 = { a i b n c n n 1 , i 0 } L_{2}=\{a^{i}b^{n}c^{n}|n\ge1,i\ge0\}
    G 2 [ S ] : G_{2}[S]: S A B S\to AB A a A ε A\to aA|\varepsilon B b B c b c B\to bBc|bc

  • L 3 = { a n b n a m b m m , n 0 } L_{3}=\{a^{n}b^{n}a^{m}b^{m}|m,n\ge0\}
    G 3 [ S ] : G_{3}[S]: A A B A\to AB A a A b ε A\to aAb|\varepsilon B a B b ε B\to aBb|\varepsilon

  • L 4 = { 1 n 0 m 1 m 0 n n , m 0 } L_{4}=\{1^{n}0^{m}1^{m}0^{n}|n,m\ge0\}
    可以看成是两部分:

    • 中间部分是 0 m 1 m 0^{m}1^{m} A 0 A 1 ε A\to 0A1|\varepsilon
    • 剩下两边的部分是: S 1 S 0 A S\to 1S0|A
      G 4 [ S ] : G_{4}[S]: S 1 S 0 A S\to 1S0|A A 0 A 1 ε A\to 0A1|\varepsilon

  1. 最左推导是指:任何一步 α β \alpha\Rightarrow\beta 都是对 α \alpha 中的最左非终结符进行替换的。 ↩︎

  2. 如果文法存在某个句子对应两颗以上不同的语法树,或者两种以上不同的最左/右推导,则称这个文法是二义的↩︎

猜你喜欢

转载自blog.csdn.net/jsx_SEVEN/article/details/92559843