资源简介
编译原理最后一次作业,在词法分析、语法分析、语义分析、中间代码基础上实现目标代码。压缩包里有源代码,实验报告和技术文档。
代码片段和文件信息
#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
相关资源
- 无符号数的词法分析程序
- 编译原理实验代码四则表达式编译及
- 西安电子科技大学编译原理大作业C
- 河北工业大学编译原理实验
- 编译原理课程设计——编译器
- 递归下降分析法的实现
- 词法分析器含代码及实验报告
- 编译原理课程设计含报告,源程序和
- 语义分析实验报告 经典
- 西安电子科技大学编译原理大作业代
- 编译原理文法的预测分析法
- 哈工大编译原理实验三次合一
- 编译原理实验----词法分析、分析预测
- 编译原理课程设计+源代码
- 四川大学编译原理课程设计报告C-词法
- 编译原理,词法分析&语法分析及源代
- 赋值语句词法和语法分析程序
- 《编译原理》课程设计指导书 算术表
- 常州工学院编译原理试卷A
- yacc实现的语法分析器
- 编译原理实验报告
- 编译原理实验报告 词法分析器实验报
- 西安科技大学编译原理往年期末试题
- 编译原理——语法分析器递归下降分
- 算术表达式的目标代码生成
- 编译原理 递归下降语法分析程序代码
- 对PL0语言及其编译器进行扩充和修改
- 编译原理大作业 完整编译器
- 编译原理课程设计——简单编译器
- 编译原理--词法分析器+语法分析器 源
评论
共有 条评论