编译原理与技术练习题汇总 下载本文

《编译原理与技术》练习题 11

S → L = R| R L → *R | id R → L

(1)构造它的LR(0)的项集; (2)构造它的LR(0)项集规范族; (3)构造识别该文法所有活前缀的DFA;

(4)该文法是SLR(1)、LR(1)以及LALAR(1)?构造相应的分析表。 5.10 对于文法G5.18[S] S → A A → Ab | bBa B → aAc | aAb | a

(1)证明它是SLR(1)文法,但不是LR(0)文法; (2)证明所有SLR(1)文法都是LR(1)文法。 5.11 证明文法G5.19[M] M → N

N → Qa | bQc | dc | bda Q → D

是LALR(1)文法,但不是SLR(1)文法。 5.12 证明文法G5.20[S] S → aAa | aBb | bAb | bBa A → c B → c

是LR(1)文法,但不是LALR(1)文法。 5.13 对于文法G5.21[S] S → AaAb | BbBa A → ? B → ?

(1)证明它是LL(1)文法,但不是SLR(1)文法; (2)证明所有LL(1)文法都是LR(1)文法。

5.14 对于下列各个文法,判断它是哪类最简单的LR文法,并构造相应的分析表。

《编译原理与技术》练习题 12

(1) (2)

A → AA + | AA* | a S → AB

A → aBa | ? B → bAb | ? (3)

S → D; B | B

D → d | ? B → B; a | a| ? (4)

S → D; B | B

D → d | ? B → B; a | a| ? (5)

S → (SR | a

R → . SR | ) (6)

S → UTa | Tb

T → S | Sc | d U → US | e

5.15 命题演算的文法G5.22[B]

B → B and B | B or B | not B | (B) | true | false | b 是二义性文法。

(1)为句子b and b or true构造两个不同的最右推导,以此说明该文法是二义的。 (2)为它写一个等价的非二义性文法。

(3)给出无二义性规则,构造出LR(0)分析表,并给出句子b and b or true的分析过程。

《编译原理与技术》练习题 13

练习 6

6.1 符号表的作用有哪些?

6.2 符号表的表项通常包括哪些属性,主要描述的内容是什么?

6.3 符号表组织的数据结构有哪些种?每种组织结构选取的主要依据是什么?

6.4 程序块是程序语言的主要构造元素,它允许以嵌套的方式确定局部声明。大多数语言规定,程序

块结构的声明作用域使最近嵌套规则,请按照这个规则写出下列声明的作用域。

main() {

/* 开始块B0 */

int a = 0; int b =0;

{ /* 开始块B1 */

int b = 1;

{ /* 开始块B2 */

int a = 2; ……

} /* 结束块B2 */ { /* 开始块B3 */

int b = 3; ……

} /* 结束块B3*/ ……

} /* 结束块B1*/ }

6.5 C语言中规定变量标识符可以定义为:extern、ertern static、auto、local static和register,请对这

5种变量分别说明其作用域。

6.6 设散列表为HT[13],哈希函数定义为hash(key)=key(整数除法取余运算),用链地址法解决

冲突对下列关键码12,23,45,57,20,3,31,15,56,78造表。

《编译原理与技术》练习题 14

练习 7

7.1 请考虑过程和活动记录的联系和区别。 7.2 请解释下列概念:

生存期,过程的活动,活动树,活动记录。

7.3 有哪些常见的参数传输方式,请分析和比较它们各自的特点。

7.4 对你熟悉的高级程序语言(如C、Pascal、C++、Java或C#),了解它们的参数传输机制。 7.5 执行下面Pascal程序的输出a结果分别是什么,如果参数的传递机制是: (1)引用调用方式; (2)值-结果调用方式;

program copyout (input, output); var a: integer;

procedure unsafe (var x: integer);

begin x := 2; a := 0 end;

begin

a := 1; unsafe (a); writeln (a)

end

7.6 执行下面程序时打印的a分别是什么,若参数的传递机制是: (1)按值调用方式; (2)引用调用方式; (3)值-结果调用方式; (4)换名调用方式。

procedure p(x, y, z); begin y := y +1; z := z+x; end p; begin a := 2;

《编译原理与技术》练习题 15

b := 3; p(a+b, a, a); print a; end;

7.7 设计存储分配时要考虑哪些主要因素?常见的存储分配策略有哪些?简单说明在什么情况下使

用哪种存储分配策略。

7.8 C++语言中关于变量的存储类型符有4个:auto、register、static和extern,请说明每个说明符所

表示的存储方式。

7.9 为下面FORTRAN程序的运行时环境构造出一个可能的组织结构,要保证对AVE的调用时存在

的一个存储器指针(参考7.4节)。

REAL A(SIZE), AVE INTEGER N, I 10 READ *, N

IF (N .LE. 0 .OR. N .GT. SIZE) GOTO 99 READ *, (A(I), I=1, N) PRINT *, ‘AVE = ‘, AVE(A, N) GOTO 10 99 CONTINUE END

REAL FUNCTION AVE (B, N) INTEGER I, N REAL B(N), SUM SUM = 0.0 DO 20 I=1, N 20 SUM = SUM+B(I) AVE = SUM/N END

7.10考虑C语言中的下列过程:

void f ( char c, char s[10], double r) { int * x;