另外,设L.fi为继承因子,L.fs为综合因子,语法制导定义如下: 产生式 S -> L 语义规则 L.i:=1; L.fi:=2; L.fs:=1; S.val:=L.val; L1.i=1; L1.fi=2; L1.fs:=1; S -> L1.L2 L2.i=2-1; L2.fi=1; L2.fs:=2-1;S.val:=L1.val+L2.val; L -> B L.s:=L.i; B.i:=L.s; L.val:=B.c; L1.i:=L.i*L1.fi; L.s:=L1.s*L1.fs; L -> L1B B.i:=L.s;L.val:=L1.val+B.c; B -> 0 B.c:=0;
B -> 1 B.c:=B.i; 5.15描述文法符号语义的属性有两种,一种称为( A ),另一种称为( B )。( A )值的计算依赖于分析树中它的( C )的属性值;( B )的值的计算依赖于分析树中它的( D )的属性值。 A,B: ①L-属性 ②R-属性 ③综合属性 ④继承属性
C,D: ①父结点 ②子结点 ③兄弟结点 ④父结点与子结点 ⑤父结点与兄弟结点 解答: A ③ B ④ C ② D ⑤ 5.16(1) 语法制导定义中某文法符号的一个属性,既可以是综合属性,又可以是继承属性。
(2) 只使用综合属性的语法制导定义称为S-属性定义。
(3) 把L-属性定义变换成翻译模式,在构造翻译程序的过程中前进了一大步。
(4)一个特定的翻译模式既适于自顶向下分析,又适于自底向上分析。 (5) 用于自顶向下分析的翻译模式,其基础文法中不能含有左递归。 (6) 在基础文法中增加标记非终结符不会导致新的语法分析冲突。 解答:(1) FALSE (2) TRUE (3) TRUE (4) FALSE
(5) TRUE (6) FALSE
6.7 (1) 对于允许递归调用的程序语言,程序运行时的存储分配策略不能采用静态的存储分配策略。( )
(2) 若一个程序语言的任何变量的存储空间大小和相互位置都能在编译时确定,则可采用静态分配策略。( )
(3) 在不含嵌套过程的词法作用域中,若一个过程中有对名字a的非局部引用,则a必须在任何过程(或函数)外被说明。( ) (4) 在允许嵌套的词法作用域的语言中,过程不能作为参数,原因时不能建立其运行环境的存取链。( )
(5) 在堆式存储分配中,一个堆中存活的活动记录不一定是邻接的。( )
(6) 如果源程序正文中过程p直接嵌入在过程q中,那么,p的一个活动记录中的存取链接指向q的最近的活动记录。( ) 解答:(1)(TRUE) (2)(FALSE) (3)(TRUE) (4)(FALSE)
(5)(TRUE) (6)(TRUE)
6.8 运行时的存储分配策略分( A )和( B )两类。( B )又分( C )和( D )。一个语言中不同种类的变量根据定义域和生存期的不同往往采用不同的存储分配策略,C语言中的静态变量往往采用( A ),而自动(out)类变量往往采用( C )。使用mallac中申请的内存单元采用( D )。
A,B,C,D: ①栈式分配 ②最佳分配 ③堆式分配 ④静态分配 ⑤随机分配 ⑥动态分配 解答: A:④ B:⑥ C:① D:③ 7.2 翻译算术表达式一(a+b)*(c+d)+(a+b+c)为 (1)四元式, (2)三元式 (3)间接三元式
解答:(1)四元式序列为:
op arg1 arg2 result
(1) (2) (3) (4) (5) (6) (7)
+ + * uminus + + + a c t1 t3 a t5 t4 b d t2 b c t6 t1 t2 t3 t4 t5 t6 t7 (2)三元式序列为:
(1) (2) (3) (4) (5) (6) (7) op + + * uminus + + + arg1 a c (1) (3) a (5) (4) arg2 b d (2) b c (6) (3)间接三元式表示:
statement op arg1 arg2
(1) (2) (3) (4) (5) (6) (7)
(11) (12) (13) (14) (11) (15) (16) (11) + (12) + (13) * (14) uminus (15) + (16) + a c (11) (13) (11) (14) b d (12) c (15) 9.1 试构造下面的程序的流图,并找出其中所有回边及循环。 read P x := 1 c := P * P if c < 100 goto L1 B := P * P x := x + 1 B := B + x write x halt L1: B:= 10 x := x + 2 B := B + x