资源简介
编译原理最后一次作业,在词法分析、语法分析、语义分析、中间代码基础上实现目标代码。压缩包里有源代码,实验报告和技术文档。

代码片段和文件信息
#include “dst_code.h“
typedef struct var_loc
{
char name[32];
int loc;
}var;
static code_node* head;
FILE* fp;
static int arg_count=0;
static int size=0;
static int count=0;
static var table[1024];
int var_get(char* name)
{
if(name[0]==‘#‘)return -1;
if(name[0]==‘*‘||name[0]==‘&‘)name++;
for(int i=0;i {
if(strcmp(nametable[i].name)==0)
return table[i].loc;
}
return -1;
}
void var_add(char* nameint sz)
{
if(name[0]==‘#‘)return;
if(name[0]==‘*‘||name[0]==‘&‘)name++;
if(var_get(name)!=-1)return;
table[count].loc=size;
size+=sz;
strcpy(table[count].namename);
count++;
}
void prep_reg(char* nameint num)
{
char temp[8];
sprintf(temp“$t%d“num);
if(name[0]==‘*‘)
{
fprintf(fp“lw %s%d($sp)\n“tempvar_get(name));
fprintf(fp“add %s%s$sp\n“temptemp);
fprintf(fp“lw %s0(%s)\n“temptemp);
}
else if(name[0]==‘&‘)
{
fprintf(fp“li %s%d\n“tempvar_get(name));
}
else if(name[0]==‘#‘)
{
fprintf(fp“li %s%s\n“temp&name[1]);
}
else
{
fprintf(fp“lw %s%d($sp)\n“tempvar_get(name));
}
}
//翻译一个函数,两参数左闭右开。
void gen_one_function(code_node* begincode_node* end);
void gen_dst_code(code_node* hFILE* f)
{
head=h;
fp=f;
fprintf(fp“%s\n““.data“);
fprintf(fp“%s\n““_prompt: .asciiz \“Enter an integer:\““);
fprintf(fp“%s\n““_ret: .asciiz \“\\n\““);
fprintf(fp“%s\n““.globl main“);
fprintf(fp“%s\n““.text“);
fprintf(fp“%s\n““read:“);
fprintf(fp“%s\n““li $v0 4“);
fprintf(fp“%s\n““la $a0 _prompt“);
fprintf(fp“%s\n““syscall“);
fprintf(fp“%s\n““li $v0 5“);
fprintf(fp“%s\n““syscall“);
fprintf(fp“%s\n““jr $ra“);
fprintf(fp“%s\n““write:“);
fprintf(fp“%s\n““li $v0 1“);
fprintf(fp“%s\n““syscall“);
fprintf(fp“%s\n““li $v0 4“);
fprintf(fp“%s\n““la $a0 _ret“);
fprintf(fp“%s\n““syscall“);
fprintf(fp“%s\n““move $v0 $0“);
fprintf(fp“%s\n““jr $ra“);
code_node* p=head*q;
do
{
q=p->next;
while(1)
{
if(strcmp(q->args[0]“FUNCTION“)==0)
break;
else if(q==head) break;
q=q->next;
}
gen_one_function(pq);
p=q;
}while(p!=head);
}
void gen_one_function(code_node* begincode_node* end)
{
count=0;
size=0;
arg_count=0;
fprintf(fp“%s:\n“begin->args[1]);
code_node* p=begin->next;
while(p!=end)
{
switch(p->args_count)
{
case 2:
{
if(strcmp(“GOTO“p->args[0])!=0)
var_add(p->args[1]4);
break;
}
case 3:
{
if(strcmp(p->args[1]“:=“)==0)
{
var_add(p->args[0]4);
var_add(p->args[2]4);
}
else if(strcmp(p->args[0]“DEC“)==0)
{
int a=strtol(p->args[2]NULL10);
var_add(p->args[1]a);
}
break;
}
case 4:
{
var_add(p->args[0]4);
break;
}
case 5:
{
var_add(p->args[0]4);
var_add(p->args[2]4);
var_add(p->args[4]4);
break;
}
case 6:
{
var_add(p->args[1]4);
var_add(p->args[3]4);
break;
}
default:;
}
p=p->next;
}
fprintf(fp“addi $sp $sp -%d\n“size);
p=begin->next;
while(p!=en
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 398478 2018-01-17 21:50 201511210132_孔令芝_目标代码生成\201511210132_孔令芝实验五报告.docx
文件 8947 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\bison.y
文件 6835 2018-01-17 18:39 201511210132_孔令芝_目标代码生成\代码\Code\dst_code.c
文件 64 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\dst_code.h
文件 3446 2018-01-17 18:34 201511210132_孔令芝_目标代码生成\代码\Code\flex.l
文件 13932 2018-01-17 18:39 201511210132_孔令芝_目标代码生成\代码\Code\ir_buffer.c
文件 1338 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\ir_buffer.h
文件 54052 2018-01-17 20:05 201511210132_孔令芝_目标代码生成\代码\Code\lex.yy.c
文件 876 2018-01-17 20:05 201511210132_孔令芝_目标代码生成\代码\Code\Makefile
文件 20144 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\semantics.c
文件 75 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\semantics.h
文件 6725 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\symbols.c
文件 4629 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\symbols.h
文件 14817 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\translate.c
文件 86 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\translate.h
文件 2020 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\tree.c
文件 1160 2015-12-07 01:44 201511210132_孔令芝_目标代码生成\代码\Code\tree.h
文件 661 2018-01-17 21:58 201511210132_孔令芝_目标代码生成\代码\Readme.txt
文件 807 2018-01-17 16:49 201511210132_孔令芝_目标代码生成\代码\Test\test4.1.asm
文件 139 2018-01-17 00:26 201511210132_孔令芝_目标代码生成\代码\Test\test4.1.c
文件 1115 2018-01-17 16:50 201511210132_孔令芝_目标代码生成\代码\Test\test4.2.asm
文件 203 2018-01-17 00:26 201511210132_孔令芝_目标代码生成\代码\Test\test4.2.c
目录 0 2018-01-17 21:58 201511210132_孔令芝_目标代码生成\代码\Code
目录 0 2018-01-17 21:53 201511210132_孔令芝_目标代码生成\代码\Test
目录 0 2018-01-17 21:58 201511210132_孔令芝_目标代码生成\代码
目录 0 2018-01-17 21:58 201511210132_孔令芝_目标代码生成
----------- --------- ---------- ----- ----
540549 26
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
评论
共有 条评论