资源简介
只能实现斐波那契数列,没有实现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个文件信息
相关资源
- 实现语法分析器-编译原理
- C语言词法分析程序
- Lex和Yacc从入门到精通.pdf
- lex yacc 文献 资料
- ComplexMatrixMathLab(C++复数矩阵数学库,
- 南开大学C++考试题
- C语言实现一个编译器-编译原理南开大
- LEX实现一个C语言子集的词法分析器
- TMS FlexCel for VCL & FMX 6.21.0.0 XE10.2
- LEX与YACC实现C语言词法分析和语法分析
- 编译原理课程设计+报告用高级语言
- XLEX生成器--防LEX
- 使用C++书写的Lex源代码
- 一个简单的lex词法分析器
- YACC 中缀表达式到后缀表达式
- 一个Lex/Yacc完整的(可使用C++)
- C++实现的单纯形算法计算程序
- C语言上机考试经典100题--南开大学出
- MS FlexGrid Control
- MFC特强大CListCtrlEx支持插入控件、设置
- CGridListCtrlEx源码vc++
- 面向对象设计自定义一个示意性的复
- C语言实现matlab的butter函数(免comple
- 编译原理课程设计 使用lex和yacc
- 基于LEX的C语言词法分析器
- 三级,南开100道题
- 利用LEX自动生成词法分析程序
- 实现词法分析器
- 编译原理 C编译器
- 实现词法分析器
评论
共有 条评论