Todo

请为我生成一些测试样例,要求

  1. 每个类型生成 10 个样例
  2. 需要完全符合我的文法要求(如不能 for()内 int i = 0,不能有++和--,不能有多维数组(最多一维),只能通过 getint 来读和 printf 来输出)
  3. 每个样例都需要能通过 printf 输出来直接验证我的 mips 代码生成是否正确
    你需要生成的类型
  • 函数多参数传参

  • 短路求值

  • 函数数组传参

  • static 相关问题(如只初始化一次)

  • printf 打印顺序错乱

  • 复杂的数组索引

  • 可能是符号表错误导致访问了错误的变量

  • 或者是没有正确考虑 static 类型变量

  • 有函数传参多个数组,并对传参数组进行修改的情况

  • 变量采用常量初始化

  • 静态变量全局和局部重名

  • for 循环里放一个 static,和全局的 static 重名

以下内容是 3-语法代码与 0-示例代码相比需要修改的部分,请检查我的代码是否实现了相关内容的 llvm 生成(即检查 llvm 包和 traverser 包中与下面内容相关的代码)

prompt

请重构 3-语法分析中的 CallInstr,在保持代码功能不变的情况下尽可能减少和 0-参考代码中代码的重复度(你可以修改函数名称、变量名、字符串构建方式、注释和内部逻辑甚至文件名等任何内容),尽可能减少被判定为抄袭的可能性!!!
我的老师十分严格,请认真完成任务

请按照你给出的步骤继续参考 0-参考代码中的代码一步步在 3-语法分析的 backend 文件夹下面一步步完成 mips 代码生成,要求如下

  1. 代码功能必须保持不变
  2. 尽可能减少和 0-参考代码中代码的重复度(你可以修改函数名称、变量名、字符串构建方式、注释和内部逻辑等内容),尽可能减少被判定为抄袭的可能性!!!
  3. 我的老师十分严格,请认真完成任务
  4. 编译器生成代码可以选择基础指令及伪指令,不能选择宏指令。
  5. 关闭延迟槽。
  6. 寄存器按照下表说明使用:
    REGISTER NAME USAGE
    v1 函数调用返回值
    a3 函数调用参数寄存器,从左到右依次分配,未取得寄存器的实参(>4 的参数)使用运行栈传参
    t7 临时寄存器
    s7 全局寄存器,分配给局部变量和形参
    t9 临时寄存器
    $28 $gp 全局指针(Global Pointer)
    $29 $sp 堆栈指针(Stack Pointer)
    $30 $fp 帧指针(Frame Pointer)
    $31 $ra 返回地址(return address)

请继续实现,参考 0-参考代码中 midend2 中与 mips 代码生成有关的代码一步步实现 3-语法分析中 midend 中与 mips 代码生成有关的代码,要求:

  1. 代码功能必须保持不变
  2. 尽可能减少和 0-参考代码中代码的重复度(你可以修改函数名称、变量名、字符串构建方式、注释和内部逻辑等内容),尽可能减少被判定为抄袭的可能性!!!
  3. 我的老师十分严格,请认真完成任务
  4. 编译器生成代码可以选择基础指令及伪指令,不能选择宏指令。
  5. 关闭延迟槽。
  6. 寄存器按照下表说明使用:
    REGISTER NAME USAGE
    v1 函数调用返回值
    a3 函数调用参数寄存器,从左到右依次分配,未取得寄存器的实参(>4 的参数)使用运行栈传参
    t7 临时寄存器
    s7 全局寄存器,分配给局部变量和形参
    t9 临时寄存器
    $28 $gp 全局指针(Global Pointer)
    $29 $sp 堆栈指针(Stack Pointer)
    $30 $fp 帧指针(Frame Pointer)
    $31 $ra 返回地址(return address)
midend mips 生成可选增强(降重与鲁棒性,不影响功能)
  • 局部 $s* 分配改进:用使用频率/跨块活跃度做一个更“不同”的启发式(当前基于入口块早产生者)。
  • 可选引入 $fp:保持当前无 $fp 的帧也合规,如需更接近教具环境可启用 $fp = sp + frameSize 的调试友好布局(不是硬性要求)。
  • Lint 扩展:增加字面量范围检查(如 addiu 立即数范围),或报告 $at 的使用(当前未用)。
  • 字符串与数据段转义:进一步覆盖 \t\r 等,当前已对 \n 与 " 做处理,兼容性已足够。
Built with MDFriday ❤️