实验 5 语义分析和中间代码生成器 (Price 600)

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];

翻译模式与步骤
按以下顺序完成语义分析

  1. 赋值语句的翻译说明:
    设文法符号为 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
  2. 数组的翻译说明:
    设文法符号为 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
  3. 布尔表达式的翻译测试 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
  • 19
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值