Tiny语言编译器之代码生成
2014-02-24 15:04
225 查看
代码生成是Tiny编译器的最后一项工作,代码生成的基础是语法树和符号表,遍历语法树,生成能够被TM虚拟机执行的指令,其中if语句和repeat语句需要利用emitSkip、emitBackup进行代码回填,因为只有全部语句指令生成完成以后才知道跳转地址。代码生成的源代码如下:
#include "globals.h"
#include "symtab.h"
#include "code.h"
#include "cgen.h"
static int tempOffset = 0;
static void cgen(TreeNode* tree);
//产生语句的代码
static void genStmt(TreeNode* tree)
{
TreeNode *p1, *p2, *p3;
int savedLoc1, savedLoc2, currentLoc;
int loc;
switch(tree->kind.stmt)
{
case IfK:
p1=tree->child[0];
p2=tree->child[1];
p3=tree->child[2];
//逻辑表达式的代码
cgen(p1);
savedLoc1=emitSkip(1); //回填位置1
//then部分代码
cgen(p2);
savedLoc2=emitSkip(1);//回填位置2
currentLoc=emitSkip(0);
emitBackup(savedLoc1);
emitRM_Abs("JEQ", ac, currentLoc, "if: jmp to else"); //回填位置1的代码
emitRestore();
//else部分代码
cgen(p3);
currentLoc=emitSkip(0);
emitBackup(savedLoc2);
emitRM_Abs("LDA", pc, currentLoc, "jmp to end"); //回填位置2的代码
emitRestore();
break;
case RepeatK:
p1=tree->child[0];
p2=tree->child[1];
savedLoc1=emitSkip(0);
cgen(p1);
相关文章推荐
- LCC编译器的源程序分析(44)函数名称的代码生成
- warning C4407: 在指向成员表示形式的不同指针之间进行转换,编译器可能生成不正确的代码
- LCC编译器的源程序分析(59)代码生成的源程序注释
- c#语言asp.net实现treeview控件读数据库动态生成树的代码
- Tiny语言编译器开发之语法分析
- 用VC编译lua源码,生成lua语言的解释器和编译器
- 编译原理及实践教材TINY编译器代码解析
- Tiny代码生成框架
- LCC编译器的源程序分析(44)函数名称的代码生成
- 语法文件解释器及编译器代码生成
- LCC编译器的源程序分析(59)代码生成的源程序注释
- Tiny语言编译器开发之语法分析(利…
- 看看GNU编译器都生成了什么样的汇编代码
- LCC编译器的源程序分析(44)函数名称的代码生成
- LCC编译器的源程序分析(57)不同目标代码生成的接口结构
- LCC编译器的源程序分析(59)代码生成的源程序注释
- C编译器剖析_5.2.4 中间代码生成及优化_后缀表达式的翻译
- 代码生成语言初设计
- Tiny代码生成框架