资源简介

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

资源截图

代码片段和文件信息

#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


评论

共有 条评论