资源简介
这个编译器的源代码是我原先为了完成编译原理实验课作业而写的,所以只具有教学价值,现在发出来和大家共享 ;-)和网上流传的版本不同,它从文法开始,一直做到了符号表的实现. 想实现自己的编译器的话,只需在把Initializtion.h中的文法修改为自己的即可.工程结构:Initializtion.h 初始化文法,便于进一步进行分析,它为构造GRAMMAR类提供了信息.其中默认非终极符用括上,修改时需要注意.Grammar.cpp Grammar.h 定义了文法GRAMMAR类,它通过initializtion.h的信息建立文法的内部表示。LL1_Analyser.cpp LL1_Analyser.h 定义了LL1分析器,即LL1_Analyser类.LL1_Recognizer.cpp LL1_Recognizer.h 为LL1语法分析驱动器,可以通过文法,TOKEN序列和LL1分析表,判定语法是否正确,同时驱动动作.Rec_Parse.cpp Rec_Pares.h 实现了递归下降分析器Rec_Parse类, 递归下降的思想和LL1驱动器一样,不过是把压栈改成调用自己,而把弹栈改成返回.Scanner.cpp Scanner.h 实现了词法分析器,可以将程序变为TOKEN序列. 扫描的源程序文件路径也在这里被定义(默认为.//demo.txt)Action.cpp Action.h 实现了语义栈的操作,_Action类定义了动作符号所对应的动作.SymTable.cpp SymTable.h 实现了符号表的建立和输出.希望大家能通过该程序对STL和编译原理有更深刻的理解,Have Fun and Good Luck! -- David.Morre
代码片段和文件信息
#include “stdafx.h“
#include “Action.h“
void _Action::call_action(const symbol &act_sym list::iterator token_pos)
{
switch (act_sym.second)
{
case 0:
_ProgHead();
return;
case 1:
_Id(token_pos);
return;
case 2:
_baseType(token_pos);
return;
case 3:
_Intc(token_pos);
return;
case 4:
_ArrayType();
return;
case 5:
_RecordType();
return;
case 6:
_TypeDec();
return;
case 7:
_FieldDec();
return;
case 8:
_Param();
return;
case 9:
_VarDec();
return;
case 10:
_ParamVar();
return;
case 11:
_AddLevel();
return;
case 12:
_SubLevel();
return;
};
}
void _Action::_ProgHead()
{}
//对标识符直接把内容压入语义栈
void _Action::_Id(list::iterator token_pos)
{
semantic_record record;
record.record_kind = ID;
record.sem_info.id_record=(char *) (g->GetStr(token_pos->value)).c_str();
sem_stack.push(record);
cout<<“Push “< }
//处理基本类型把相应信息压入语义栈
void _Action::_baseType(list::iterator token_pos)
{
semantic_record record;
record.sem_info.type_record = new TypeIR;
record.record_kind = TYPE;
switch (token_pos->value.second)
{
case 19: //处理整型
{
record.sem_info.type_record->size = 1;
record.sem_info.type_record->kind = intTy;
cout<<“Push type of integer in the semantic stack.“< break;
}
case 20: //处理字符
{
record.sem_info.type_record->size = 1;
record.sem_info.type_record->kind = charTy;
cout<<“Push type of char in the semantic stack.“< break;
}
default:
{
cerr<<“This type is error!“< exit(1);
}
}
sem_stack.push(record);
}
//处理整型常量直接压入语义栈
void _Action::_Intc(list::iterator token_pos)
{
semantic_record record;
record.record_kind = INTC;
sscanf ((g->GetStr(token_pos->value)).c_str() “%d“ &record.sem_info.intc);
sem_stack.push(record);
cout<<“Push “< }
//处理数组类型从语义栈提取lowtop和元素类型信息填入数组语义纪录中并压栈
void _Action::_ArrayType()
{
semantic_record record;
record.sem_info.type_record = new TypeIR;
record.record_kind = TYPE;
semantic_record b = sem_stack.top();
sem_stack.pop();
semantic_record t = sem_stack.top();
sem_stack.pop();
semantic_record l = sem_stack.top();
sem_stack.pop();
assert(l.record_kind == INTC);
assert(t.record_kind == INTC);
assert(b.record_kind == TYPE);
assert(b.sem_info.type_record->size == 1);
record.sem_info.type_record->kind = arrayTy;
record.sem_info.type_record->More.ArrayAttr.low = l.sem_info.intc;
record.sem_info.type_record->More.ArrayAttr.top = t.sem_info.intc;
if (b.sem_info.type_record->kind == intTy)
record.sem_info.type_record->More.ArrayAttr.elemTy = &_intc;
else if (b.sem_info.type_record->kind == charTy)
record.sem_info.type_record->More.ArrayAttr.elemTy = &_charc;
record.sem_info.type_record->s
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2007-04-20 17:01 Compiler\
文件 9337 2006-03-17 19:48 Compiler\Action.cpp
文件 953 2006-03-17 19:48 Compiler\Action.h
文件 612 2006-03-11 22:32 Compiler\Compiler.cpp
文件 5468 2006-03-07 21:29 Compiler\Compiler.dsp
文件 524 2006-03-07 19:20 Compiler\Compiler.dsw
文件 189440 2007-04-20 17:01 Compiler\Compiler.ncb
文件 57856 2007-04-20 17:01 Compiler\Compiler.opt
文件 1882 2007-04-20 16:21 Compiler\Compiler.plg
目录 0 2007-04-20 16:28 Compiler\Debug\
文件 743 2006-03-11 23:52 Compiler\demo.txt
文件 5574 2006-03-17 16:58 Compiler\Grammar.cpp
文件 1574 2006-03-17 16:50 Compiler\Grammar.h
文件 8482 2006-03-17 16:38 Compiler\Initializtion.h
文件 8444 2006-03-17 17:17 Compiler\LL1_Analyser.cpp
文件 1244 2006-03-17 17:03 Compiler\LL1_Analyser.h
文件 2172 2006-03-17 19:04 Compiler\LL1_Recognizer.cpp
文件 968 2006-03-17 19:19 Compiler\LL1_Recognizer.h
文件 1188 2007-04-20 16:58 Compiler\readme.txt
文件 1541 2006-03-17 19:17 Compiler\Rec_Parse.cpp
文件 746 2006-03-11 00:01 Compiler\Rec_Parse.h
文件 3191 2007-04-20 16:20 Compiler\Scanner.cpp
文件 599 2006-03-17 19:06 Compiler\Scanner.h
文件 301 2006-03-05 00:05 Compiler\StdAfx.cpp
文件 1103 2006-03-08 12:28 Compiler\StdAfx.h
文件 3650 2006-03-17 19:54 Compiler\SymbTable.cpp
文件 884 2006-03-17 19:54 Compiler\SymbTable.h
文件 3098 2006-03-17 16:43 Compiler\TypeDef.h
相关资源
- liblas源码 可用于读取las点云数据等
- 海康相机车牌识别源码
- 仿饿了么外卖源码
- 骷髅头赛跑游戏源码
- unity+AR跳舞游戏项目源码
- 制作的flash的mv全套打包
- 我的系统正用着权限管理系统源码
- springmvc-学习指南(第二版)源码
- CSocket多线程聊天室源码
- 2018最新友价内核仿互站源码二次开发
- 全新富贵3电玩三代网站源码工具等亲
- 利物直播购物商城小程序V1.1.48后台源
- SSM框架,仿《简书》整站无后台管理
- 编译HiMobileCam_SDK需要的源码集.rar
- worldwind1.4.net版,已修改,可编译通过
- opencv交叉编译依赖包
- Unity赛车游戏资源+源码
- google的tensor2tensor的学习源码
- MPLAB的XC8编译器
- 深度学习入门之Pytorch带书签和源码
- 网上资源管理系统ssm-源码
- Live555_2017-vs2015 x64 x86 完全编译版本(
- 自己动手写编译器 链接器 高清扫描版
- 基于SSM的校园门户网站设计与实现
- 基于websocket的即时通讯H5App源码.rar
- STM32F4XX的FOC5.0工程,已经编译通过
- 自动更新程序源码
- Flowable modeler集成源码
- ACE+TAO-6.4.6 ACE源码
- 基于颜色特征的图像检索技术研究与
评论
共有 条评论