• 大小: 1.09MB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-23
  • 语言: C/C++
  • 标签: LEX  YACC  南开  王刚  

资源简介

只能实现斐波那契数列,没有实现pi.c,得分五分 上机大作业——简化C编译器实现 总体要求 一、要求实现的语言特性 1. 基本要求 1数据类型:int,char 2语句:赋值(=),if,while,for;赋值 循环 条件判断 3算术运算:+,-,*,/,%,++,--,&,|,^,~,<> 4关系运算:==,>,=,<=,!= 5逻辑运算:&&(与),||(或),!(非);构造与算数相同 6复合语句:{、}括起来的语句;要求识别 if、while中使用 7注释语句;识别注释 然后丢弃 8简单的输入输出 2. 选作功能 1数组,指针;数组怎么实现 第八章介绍数组的翻译 2函数 3其他特性(浮点运算、结构/类、连接C标准库等等) 生成的目标代码 生成x86汇编语言程序。;不要求二进制 由编译器编译成二进制 要求提交的内容 1C语言子集的描述:词法结构的正则表达式定义、语法结构的CFG定义。 ;简化子集的描述 2编译器源程序文本,包括Lex、Yacc等程序和C/C++程序。;两种语言工具 构造词法分和语法分析部分 passive generate 3编译器演示程序,可将C语言子集测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误,如斐波那契数列程序,应能翻译为正确的汇编程序。

资源截图

代码片段和文件信息


#include “globals.h“
#include “util.h“
#include “parse.h“
#include “symtab.h“
#include “analyze.h“

/* counter for variable memory locations */
static int location = 0;

/* current symble table */
static Symtab * pTable;
static FunEntry * pFun;

/* procedure traverse is a generic recursive
 * syntax tree traversal routine:
 * it applies preProc in preorder and postProc
 * in postorder to tree pointed to by t
 */
static void traverse(TreeNode * t
 void (* preProc) (TreeNode *)
 void (* postProc) (TreeNode *))
{
if (t != NULL)
{
int i;
preProc(t);
for (i=0; i < MAXCHILDREN; i++)
traverse(t->child[i] preProc postProc);
postProc(t);
traverse(t->sibling preProc postProc);
}
}

/* nullProc is a do-nothing procedure to
 * generate preorder-only or postorder-only
 * traversals from traverse
 */
static void nullpreProc(TreeNode * t)
{
if (t == NULL) return;
else if (t->nodekind == Dec) {
switch (t->kind.dec)
{
case FunDefK:
pFun = Lookup_Fun(t->attr.name);
break;
case CompK:
pTable = t->attr.table;
break;
}
}
}

static void nullpostProc(TreeNode * t)
{
if (t == NULL || pTable == NULL) return;
else if (t->nodekind == Dec && t->kind.dec == CompK)
pTable = pTable->parent;
}

/* procedure insertNode inserts
 * identifiers stored in t into
 * the symbol table
 */
static void insertNode(TreeNode * t)
{
switch (t->nodekind)
{
    case Dec:
switch (t->kind.dec)
{
case FunDecK:
if (Lookup_Fun(t->attr.name) == NULL)
Insert_Fun(t->attr.name t->type t->child[0]);
break;
case FunDefK:
if (Lookup_Fun(t->attr.name) == NULL)
pFun = Insert_Fun(t->attr.name t->type t->child[0]);
break;
case VarK:
{
ValEntry Entry;
TreeNode * child;
for (child = t->child[0]; child != NULL; child = child->sibling) {
if (child->nodekind == Exp && child->kind.exp == IdK) {
if (Lookup_Var(pTable pFun child->attr.name &Entry) != pTable->nestlevel)
if (child->child[0] == NULL)
Insert_Var(pTable child->attr.name t->type 1);
else
Insert_Var(pTable child->attr.name t->type child->child[0]->attr.val.i);
}
else if (child->nodekind == Stmt && child->kind.stmt == AssignK) {
if (Lookup_Var(pTable pFun child->child[0]->attr.name &Entry) != pTable->nestlevel)
if (child->child[0]->child[0] == NULL)
Insert_Var(pTable child->child[0]->attr.name t->type 1);
else
Insert_Var(pTable child->child[0]->attr.name t->type child->child[0]->child[0]->attr.val.i);
}
}
}
break;
case CompK:
pTable = Createtab(pTable pFun);
if (pTable==NULL)
fprintf(listing “Out of memory error at line %d\n“ t->lineno);
t->attr.table = pTable;
break;
        default:
break;
      }
      break;
default:
break;
}
}

/* function buildSymtab constructs the symbol
 * table by preorder travers

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-12-12 15:34  complier_第五次作业_小型C编译器\
     文件        8133  2012-12-27 12:28  complier_第五次作业_小型C编译器\analyze.c
     文件         314  2012-12-27 12:29  complier_第五次作业_小型C编译器\analyze.h
     目录           0  2016-12-08 19:00  complier_第五次作业_小型C编译器\Backup\
     目录           0  2016-12-12 15:30  complier_第五次作业_小型C编译器\Backup1\
     文件         953  2016-12-08 19:00  complier_第五次作业_小型C编译器\Backup1\main.sln
     文件       25104  2012-12-27 12:29  complier_第五次作业_小型C编译器\CodeGen.c
     文件        1807  2012-12-27 12:29  complier_第五次作业_小型C编译器\CodeGen.h
     目录           0  2016-12-08 19:00  complier_第五次作业_小型C编译器\Debug\
     文件       15522  2012-12-27 12:48  complier_第五次作业_小型C编译器\Debug\analyze.obj
     文件       75491  2012-12-27 12:48  complier_第五次作业_小型C编译器\Debug\CodeGen.obj
     文件      254058  2008-12-25 19:59  complier_第五次作业_小型C编译器\Debug\main.exe
     文件     1092656  2008-12-25 19:59  complier_第五次作业_小型C编译器\Debug\main.ilk
     文件        9350  2012-12-27 12:48  complier_第五次作业_小型C编译器\Debug\main.obj
     文件       76577  2008-12-23 21:42  complier_第五次作业_小型C编译器\Debug\parse.obj
     文件       13821  2008-12-23 21:42  complier_第五次作业_小型C编译器\Debug\scan.obj
     文件       13379  2008-12-23 14:31  complier_第五次作业_小型C编译器\Debug\symtab.obj
     文件       27178  2008-12-23 21:42  complier_第五次作业_小型C编译器\Debug\util.obj
     文件       74752  2012-12-27 13:43  complier_第五次作业_小型C编译器\Debug\vc60.idb
     文件       53248  2012-12-27 13:43  complier_第五次作业_小型C编译器\Debug\vc60.pdb
     文件        3138  2012-12-27 12:29  complier_第五次作业_小型C编译器\globals.h
     文件        2503  2016-12-08 18:46  complier_第五次作业_小型C编译器\main.c
     文件        4212  2008-12-22 10:11  complier_第五次作业_小型C编译器\main.dsp
     文件         533  2008-12-22 10:11  complier_第五次作业_小型C编译器\main.dsw
     文件      295936  2012-12-27 13:43  complier_第五次作业_小型C编译器\main.ncb
     文件       52736  2012-12-27 13:43  complier_第五次作业_小型C编译器\main.opt
     文件        1501  2012-12-27 13:43  complier_第五次作业_小型C编译器\main.plg
     文件     2555904  2016-12-12 15:34  complier_第五次作业_小型C编译器\main.sdf
     文件         953  2016-12-12 15:30  complier_第五次作业_小型C编译器\main.sln
     文件       23040  2016-12-12 15:34  complier_第五次作业_小型C编译器\main.v12.suo
     文件        6778  2016-12-12 15:30  complier_第五次作业_小型C编译器\main.vcxproj
............此处省略19个文件信息

评论

共有 条评论