第五章例题与补充作业
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
控制语句的翻译 GS (1) S→ if E then S (2) S→ if E then S1 else S2 (3) S→ while E do S (4) S→ A (A → i=E 表示赋值语句) (5) L→ L1; S (L表示语句串) (6) L→ S 很明显:程序设计语言的语句与其文法 结构一般不会完全一致,需等价变换。
•三、设计For语句的隐式转向四元式形式的中间代码结构。 For E1 To E2 Step E3 …… Next //这是for语句的结构,E1为初值,E2为终值,E3为步长 解:For语句隐式转向四元式形式的中间代码结构设计如下: Four( E1 ) (for, - , - , -) 可对应一条Nop汇编指令 Four( E2 ) (fjmp, res(E2) , - , -) 假出口转向forend四元式地址加1 Four( S ) Four( E3 ) (Next, - , - , -) (jmp, - , - , for四元式) // 如果没有for四元式,则转向Four(E2)的第一个四元式; 增加一个for四 元式使结构非常清晰
Fra Baidu bibliotek
• 四、 给出语句For (i=1; i<=n; i=i+10) k=k+1; 的隐式转向四元式序列和显式转向 四元式序列。
• 五、 给出表达式求导数的语法制导定义, 表达式仅有“*”和“+”作用于变量x和常数 形式d,并假定没有任何化简。 解:GE E → E + E {E’ → E’ + E’ } E → E * E {E’ → E’ * E + E * E’ } E → x {E’ → 1 } E → d {E’ → 0 } E → (E1) {E’ → E1’ } E’表示对E求导数 d表示常数
(2) if E then S1 else S2 中间代码如图5.8所示
(3) while E do S 中间代码如图5.9
例:写出下列语句的四元式形式的中间代码: 使用的是隐式转向四元式
if x=y+1 then x=x*y else while x<>0 do {x=x-1; y=y+2} 红色部分是改写为相应显式转向四元式 的结果。
关于控制语句到显式转向四元式中间 代码的翻译,需要考虑“真”、“假”出 口的“拉链与回填”问题,引进相关语义 变量如S.chain记录E的待回填的“假”出 口。 为了及时翻译出控制语句的四元式形 式的中间代码,处理和回填有关信息,完 全面向原文法是不可能办到的,必须对原 文法进行变换,参考课本P122
• • • • • • • • • •
(+ , y , 1, T1) (==, X , T1, T2) (then , T2 , -, -) (fjmp, T2 , -, addr(else)+1) … (else , - , -, -) (jmp, -, -, addr(ifend)) (while , - , -, -) (<>, x, 0, T4) (do, T4, -, -) (fjmp, T2 , -, addr(whend)+1) …… (whend , - , -, -) (jmp, -, -, addr(while)) (ifend , - , -, -)
补充作业:
一、写出下列语句的四元式形式的中间代码: 使用隐式转向四元式 <1> if x>0 then x=0 else x=1; <2> While x>a+1 do x=x-1;
• 二、构造变量声明语句中统计声明变量个 数的语义规则,考虑如下文法: GS : S →TL T → integer T → real L→i L → L, i
考虑用“then”、“else”、“ifend”、 “do”、“while”、“whend”表示的隐式转 向四元式。 则:条件及循环语句四元式中间代码的 形式定义为:
(1) if E then S 中间代码如图5.7所示 其中:four(E)表示计算E的四元式序列 res(E): 存放E的结果的临时变量 first(S): S的第一个四元式的地址 last(S): S的最后一个四元式的地址