跳转至

布尔表达式的翻译

  • 布尔表达式的两个基本作用:
    • 用于逻辑演算,计算逻辑值
    • 用于控制语句的条件式
  • 产生布尔表达式的文法:
  • 计算的两种方法:
    1. 同计算算数表示是一样,一步步进行计算
    2. 采用优化措施:
      1. A or Bif A then true else B
      2. A and Bif A then B else false

数值表示法的翻译模式

  • 过程emit将三地址代码送到输出文件中
  • nextstat给出输出序列中,下一条三地址语句的地址索引
  • 每产生一条三地址语句后,过程emit便把nextstat+1image.pngimage.png

条件控制的布尔表达式翻译

  • 两种出口:一真一假image.png
  • 每次调用函数newlabel后都翻译一个新的符号标号
  • 对于一个布尔表达式\(E\),引用两个标号:
    • E.true是为true时控制流转向的标号
    • E.false是为false时控制流转向的标号

布尔表达式的一遍扫描

  • 采用四元式的形式
  • 把四元式存入一个数组中,数组的下标就代表四元式的标号
  • 约定:
    • jnz, a, -, pif a goto p
    • jrop, x, y, pif x rop y goto p
    • j, -, -, pgoto p
  • 回填:有时,四元式的转移地址无法立即知道,我只将这个未完成的四元式地址作为E的语义值保存起来,待机回填
  • \(E\)的两个综合属性:
    • truelist:需要回填真出口的四元式的标号所构成的链表
    • falselist:需要回填假出口的四元式的标号所构成的链表
  • 为了处理truelistfalselist,引入下列语义变量和过程:
    • 变量:
      • nextquad:只想下一条将要产生但尚未形成的四元式地址
        • 每一次emit之后,自增
    • 过程:
      • makelist(i):创建一个仅含i的新链表,甘薯返回只想这个链的指针
        • i是四元式数组的一个下标
      • merge(p1, p2):合并以p1p2为链首的两个链表,会送合并后的链首
      • backpatch(p, t):完成回填,把p所链接的每个四元式的第四区段都填为t
  • 翻译模式:image.pngimage.pngimage.pngimage.png