WX: help-assignment
code price 600
实验 5 语义分析和中间代码生成器
语义分析器分两部分,第一部分为赋值表达式,第二部分为数组、布尔表达式和控制语句。
要求
参考课本 6.4.2、6.4.3 和 7.3、7.4、7.5,实现递归下降翻译器。
注意
数据结构:
四元式:结构体
四元式序列:结构体数组
跳转语句的四元式的第 4 个域需回填。
测试
while(a<b)
if©
while(d>e)
x1=y1; else
x2=y2;
x3[k]=y3[i,j];
翻译模式与步骤
按以下顺序完成语义分析
- 赋值语句的翻译说明:
设文法符号为 X,其属性如下:
X.place:存放 X 值的变量的名字;
X.inArray:指向符号表中相应标识符表项的指针,若不使用符号表,则 X.inArray 即为标识符。
函数 emit( ):生成四元式语句;
函数 newtemp( ): 生成一个临时变量的名字,如 t1。
测试:
输入: a=6/b+5*c-d; 输出:
0: /, 6, b, t1
1: *, 5, c, t2
2: +, t1, t2, t3
3: -, t3, d, t4
4: =, t4, -, a - 数组的翻译说明:
设文法符号为 X,其属性如下:
X.inNdim:下标表达式的个数,及维数
X.inPlace:存放由 Elist 中的下标表达式计算出来的值
X.array:指向符号表中相应数组名字表项的指针
X.place:若 X 为简单名字,X.place 为指向符号表中相应此名字表项的指针;若 X 为数组名字,X.place 为 数组地址中常量部分
X.offset:若 X 为简单名字,X.offset 为 null;若 X 为数组名字,X.offset 为数组地址中变量部分
limit(array, j):返回 nj,即 array 数组的第 j 维长度,如 10、20 等。本实验中,就用字符串 nj 表示,如 n1、n2、n3 等
测试 1: 输入:
x=A[i];
输出:
0: -, A, C, t1
1: *, i, w, t2
2: =[], t1[t2], -, t3
3: =, t3, -, x
测试 2:输入: x=A[i, j];
输出:
0: *, i, n2, t1
1: +, t1, j, t1
2: -, A, C, t2
3: *, t1, w, t3
4: =[], t2[t3], -, t4
5: =, t4, -, x - 布尔表达式的翻译测试 1: 输入: while(a
1: 输入:
while(a<b)
if©
x=y+z;
else
x=y-z; a=y;
输出:
0: j<,a,b,-
1: j,-,-,-
2: jnz,c,-,-
3: j,-,-,-
4: +,y,z,t1
5: =,t1,-,x
6: -,y,z,t2
7: =,t2,-,x
8: =,y,-,a
测试2:
输入:
if(a<b)
while©
if(d)
x=y+z; else
m=n;
else
s=t;
u=v;
输出:
0: j<, a, b, -
1: j,-,-,-
2: jnz, c, -,-
3: j,-,-,-
4: jnz, d, -,-
5: j, -,-,-
6: +, y, z, t1
7: =, t1,-,x
8: =, n,-, m
9: =, t,-, s
10: =, v,-, u
4.控制语句的翻译说明:
merge(p1,p2):把以p1和p2为链首的两条链合并为一,将p2的链尾的第4区段改为p1,合并后的链首为p2,回送合并后的链首测试1:
输入:
while(a<b)
if©
x=y+z;
else x=y-Z; a=y;
输出:
0: j<,a,b,2
1: j,-,-,10
2: jnz, c,-,4
3: j,-, -, 7
4: +, y, z, t1
5: =, t1,-, x
6: j, -, -, 0
7: -, y, z, t2
8: =, t2,-, x
9: j,-,-,0
10: =, y,-, a
测试 2:
输入: if(a<b)
while©
if(d)
x=y+z; else
m=n;
else
s=t; u=V;
输出:
0: j<, a, b, 2
1: j,-,-,12
2: jnz, c,-, 4
3: j,-,-,13
4: jnz, d, -, 6
5: j,-,-,9
6: +, y, z, t1
7: =,t1,-,x
8: j,-,-,2
9: =, n,-,m
10: j,-,-,2
11 j,-,-,13
12: =,t,-,s
13: =,v,-,u