[答案]
2、 令
S.val为下面的文法由S生成的二进制数的值(如,对于输入101.101,S.val=5.625);
S→L.L | L L→LB | B B→0 | 1 [答案]
val为综合属性,代表值属性
语法制导定义
产生式 语义规则 S.val:=L.val+L.val/2S.val:=L.val 12L2.length.L2 S?L S?L1 L?L1B L.val:=L.val*2+B.val 1L.length:=L1.length+1 L?B B?0 B?1 L.val:=B.val L.length:=1 B.val:=0 B.val:=1 3、下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结果为整数,否则为
E→E+T | T T→num.num | num 给出语法制导定义确定每个子表达式的类型。 [答案]
设type是综合属性,代表各非终结符的“类型”属性
产生式 E?E1语义规则 IF (E.type=integer) and (T.type=integer) THEN E.type:=integer ELSE E.type:=real E.type:=T.type T.type:=real T.type:=integer 1+T E?T T?num.num T?num
4、利用下列文法 E→E+T | T T→num.num | num 把表达式翻译成前缀形式,并且决定类型。试用一元运算符inttoreal[答案]
把整型值转换为相等的实型值,以使得前缀表
为综合属性,代表各非终结符的代码属性
type为综合属性,代表各非终结符的类型属性 inttoreal把整型值转换为相等的实型值 vtochar将数值转换为字符串
语法制导定义
产生式 S->E E?E1+T 语义规则 print E.code IF (E1.type=integer) and (T.type=integer) THEN begin E.type:=integer E.code='+'||E1.code ||T.code; end ELSE begin E.type:=real IF E1.type=integer THEN begin E1.type:=real E1.val:=inttoreal(E1.val) 设code
E1.code=vtochar(E1.val) end IF T.type:=integer THEN begin T.type:=real T.val:=inttoreal(T.val) T.code=vtochar(T.val) end E.code='+'||E1.code||T.code; End E?T E.type:=T.type E.val:=T.val E.code=vtochar(E.val) T?num.num T.type:=real T.val:=num.num.lexval T.code=vtochar(T.val) T.type:=integer T.val:=num.lexva T.code=vtochar(T.val) T?num 5、请按语法制导的定义,将后缀表达式翻译成中缀表达式。注意,不允许出现冗余括号,后续表达式的文法如下: E→EE+ E→EE* E→id [答案]
产生式 S→E E→E1E2+ E→E1E2* 语义规则 print E.code E.code=E1.code||'+'||E2.code; E.op='+' IF E1.op='+' AND E2.op='+' THEN E.code=\1.code||')'||'*'||'('||E2.code||')'; E→id
ELSE IF E1.op='+'THEN E.code=\1.code||')'||'*'||E2.code; ELSE IF E2.op='+'THEN E.code=E1.code||'*'||'('||E2.code||')'; ELSE E.code=E1.code||'*'||E2.code||; E.code:=id.lexeme;
6、有文法: S→(L)|a L→L,S|S
给此文法配上语义动作子程序(或者说为此文法写一个语法制导定义),它输出配对括号的个数。如对于句子[答案]
拓展文法:加入新开始符号S'和产生式S'→S
设num为综合属性,代表值属性
语法制导定义 产生式 S'→S S→(L) S→a L→L1,S L→S
语义规则 print(S.num) S.num:=L.num+1 S.num:=0 L.num:=L1.num+S.num L.num:=S.num
7、假设变量的说明是由下列文法生成的:
D→i L L→,i L | :T T→integer | real 1)建立一个语法制导定义,把每一个标志符的类型加在符号表中 2)为1)构造一个预翻译程序 [答案]
1)type为综合属性,代表类型属性,
函数addtype实现向符号表中i对应项填类型信息。 语法制导定义 产生式 D→i L L→,i L L→:T T→integer T→real 1语义动作 D.Type:=L.Type addtype(i.entry,D.type) L.Type:=L.Type addtype(i.entry, L.type) L.type:=T.type T.type:=integer T.type:=real 1b) 采用递归下降分析法编写预翻译程序: Procedure D; begin
if lookahead=id then begin
match(id); D.type=L;
addtype(id.entry,D.type) end
else error end Function L: DataType; begin
if lookahead=’,’ then begin
match(‘,’);
if lookahead=id then begin
match(id); L.Type=L;
addtype(id.entry,L.type); return(L.type) end