今天的任务:把一个文法翻译成中间代码。

如何产生任意多个语句?蓝色下标的线

  • 赋值语句。掩盖掉细节。
  • 今日重点:三条指令的翻译。
  • 这三条语句都涉及到大B,为布尔表达式
  • 控制流的翻译避免不了对大B的翻译
  • 对于break 跳转到什么地方去,嵌套while 返回到上一层
  • 重要+难度 控制流语句翻译
  • 为什么创造困难?生成更高效的代码
  • 简单的方案会产生冗余,如何消除冗余?
  • 简单,体现在两点:各个非终结符分工 合作;只需要使用综合属性

在做中间代码生成的时候,心中有树 大局观 自底向上

分工与合作

大S所做的事情 改变分支流

中间代码的实现

  • 需要做的事情:
  • 实现方式:listeners,visitors,attributes grammer 嵌入到文法中
  • 监听者模式的问题:退出socpe的时候实现;但是标签插入时机 不对。 没办法一边解析一边输出 只能缓存
  • 访问者:及时输出生成的中间代码,避免频繁字符串拼接。
  • 左边和右边生成相对应的中间代码递归
  • break 压栈的动作 while false,while开始 入栈 break语句出栈。使用栈结构追踪跳转到哪一层while
  • 如何实现短路求值?条件 增加两个标签