资源简介
用c++语言在tiny编译器的基础上加了一些语法规则。代码绝对没错误,能够比较智能的报错。实现了此法扫描、语法分析、语意分析、中间代码生成。
代码片段和文件信息
#include
#include “globals.h“
#include “symtab.h“
#include “analyze.h“
using namespace std;
static int location = 0;
static void traverse( TreeNode * t
void (* preProc) (TreeNode *)
void (* postProc) (TreeNode *) )
{
if (t != NULL)
{
preProc(t);
for (int i=0; i < MAXCHILDREN; i++)
traverse(t->child[i]preProcpostProc);
postProc(t);
traverse(t->siblingpreProcpostProc);
}
}
static void nullProc(TreeNode * t)
{ return;}
static void insertNode( TreeNode * t)
{
switch (t->nodekind)
{
case StmtK:
switch (t->kind.stmt)
{
case AssignK:
case ReadK:
if (st_lookup(t->attr) == -1)//表中还没有
st_insert(t->attrt->lineNolocation++t->type);
else //已经在表中
st_insert(t->attrt->lineNo0t->type);
break;
default:
break;
}
break;
case ExpK:
switch (t->kind.exp)
{
case IdK:
if (st_lookup(t->attr) == -1)//表中还没有
st_insert(t->attrt->lineNolocation++t->type);
else //已经在表中
st_insert(t->attrt->lineNo0t->type);
break;
default:
break;
}
break;
default:
break;
}
}
void buildSymtab(TreeNode * syntaxTree)
{
traverse(syntaxTreeinsertNodenullProc);
cout<<“\nSymbol table:\n\n“;
printSymTab();
}
static void checkNode(TreeNode * t)
{
// if(t->nodekind==ExpK)
if(t->kind.exp==OpK)
{
if(t->attr==“and“||t->attr==“or“)
{
if(t->child[0]!=NULL && t->child[1]!=NULL&&
(t->child[0]->type!=BOOL || t->child[1]->type!=BOOL))
{ok=false;cout<lineNo<<“:运算符:“<attr<<“ 两边不都是bool类型\n“;}
else t->type=BOOL;
}
else if(t->attr==“not“)
{
if(t->child[0]!=NULL && t->child[0]->type!=BOOL)
{ok=false;cout<lineNo<<“: not运算符后面不是bool类型\n“;}
else t->type=BOOL;
}
else if(t->attr==“>“||t->attr==“>=“||
t->attr==“<“||t->attr==“<=“)
{
if(t->child[0]!=NULL && t->child[1]!=NULL&&
(t->child[0]->type!=INT || t->child[1]->type!=INT))
{ok=false;cout<lineNo<<“: 比较符:“<attr<<“ 两边不是int类型\n“;}
else t->type=BOOL;
}
else if(t->attr==“=“)
{
if(t->child[0]!=NULL && t->child[1]!=NULL&&t->child[0]->type!=t->child[1]->type)
{ok=false;cout<lineNo<<“: =号两边类型不一致\n“;}
else t->type=BOOL;
}
else if(t->attr==“+“||t->attr==“-“||t->attr==“*“||t->attr==“/“)
{
if(t->child[0]!=NULL && t->child[1]!=NULL&&
(t->child[0]->type!=INT || t->child[1]->type!=INT))
{ok=false;cout<lineNo<<“: 算术运算符:“<attr<<“ 两边不是int类型\n“;}
else t->type=INT;
}
}
//else
if(t->nodekind==StmtK)
switch (t->kind.stmt)
{ case IfK:
if (t->child[0]!=NULL && t->child[0]->type != BOOL)
{ok=false;cout<lineNo<<“: if 语句后面不是bool类型语句\n“;}
break;
case AssignK:
if (t->child[0]!=NULL && t->type != t->child[0]->type)
{ok=false;cout<lineNo<<“: 赋值号两边类型不一样\n“;}
break;
case RepeatK:
if (t->
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 180224 2010-11-25 00:55 mybianyi\Debug\mybianyi.exe
文件 1183076 2010-11-25 00:55 mybianyi\Debug\mybianyi.ilk
文件 1633280 2010-11-25 00:55 mybianyi\Debug\mybianyi.pdb
文件 3455 2010-11-25 00:55 mybianyi\mybianyi\analyze.cpp
文件 116 2010-11-16 20:51 mybianyi\mybianyi\analyze.h
文件 2701 2010-11-24 16:45 mybianyi\mybianyi\cgen.cpp
文件 359 2010-11-21 12:08 mybianyi\mybianyi\cgen.h
文件 52625 2010-11-25 00:55 mybianyi\mybianyi\Debug\analyze.obj
文件 6896 2010-11-25 00:55 mybianyi\mybianyi\Debug\BuildLog.htm
文件 109611 2010-11-24 16:45 mybianyi\mybianyi\Debug\cgen.obj
文件 24641 2010-11-21 10:08 mybianyi\mybianyi\Debug\globals.obj
文件 42812 2010-11-24 17:04 mybianyi\mybianyi\Debug\main.obj
文件 65 2010-11-25 00:55 mybianyi\mybianyi\Debug\mt.dep
文件 663 2010-11-10 22:33 mybianyi\mybianyi\Debug\mybianyi.exe.em
文件 728 2010-11-10 22:33 mybianyi\mybianyi\Debug\mybianyi.exe.em
文件 621 2010-11-25 00:55 mybianyi\mybianyi\Debug\mybianyi.exe.intermediate.manifest
文件 425512 2010-11-24 17:03 mybianyi\mybianyi\Debug\parse.obj
文件 38510 2010-11-21 10:08 mybianyi\mybianyi\Debug\scan.obj
文件 353878 2010-11-21 10:08 mybianyi\mybianyi\Debug\symTab.obj
文件 54494 2010-11-25 00:35 mybianyi\mybianyi\Debug\util.obj
文件 379904 2010-11-25 00:55 mybianyi\mybianyi\Debug\vc90.idb
文件 405504 2010-11-25 00:55 mybianyi\mybianyi\Debug\vc90.pdb
文件 211 2010-11-11 10:11 mybianyi\mybianyi\globals.cpp
文件 1487 2010-11-24 16:45 mybianyi\mybianyi\globals.h
文件 952 2010-11-24 17:04 mybianyi\mybianyi\main.cpp
文件 4762 2010-11-21 10:08 mybianyi\mybianyi\mybianyi.vcproj
文件 1409 2010-11-25 08:18 mybianyi\mybianyi\mybianyi.vcproj.zwj-PC.zwj.user
文件 15092 2010-11-24 17:03 mybianyi\mybianyi\parse.cpp
文件 171 2010-11-16 20:54 mybianyi\mybianyi\parse.h
文件 4958 2010-11-14 00:43 mybianyi\mybianyi\scan.cpp
............此处省略15个文件信息
相关资源
- c++MFC车牌自动识别定位,只能定位和
- 超级玛丽c++源码win32Linux平台
- 数值分析算法程序设计 C++实现
- c++自制小游戏--扑克牌
- c++课程设计学生管理系统浙工大源码
- mysql+dev c++实现订单管理系统
- VC++实现RSA加密算法
- 电子宠物C++完整代码可直接运行
- C++ 读取excel2007文件,转成lua文件
- AAM算法实现
- 扑克牌 c++
- 五子棋C++(Qt版).zip
- python 3.8终极大法解决Microsoft Visual C
- C&C++外挂编写深究(入门外挂编写)
- 多功能计算器实现C++代码以及代码详
- c++监控USB插拔状态源码
- 大富翁源代码
- VC++ 中国象棋经典游戏源代码
- C++程序源代码--21点的扑克牌游戏
- ADRC相关技术资料
- 基于Cocos2dx的炸弹人游戏
- 简易学生管理系统源码 数据结构 大作
- 顿开教育C++公开课项目视频集合
- 郁金香VC++游戏辅助视频教程
- 高考成绩管理系统 c++版
- C++模拟存储器的分配与回收算法实现
- C语言进阶源码---基于graphics实现图书
- Effective C++(第三版中文版) - Scott
- C和C++.rar
- 酒店餐饮管理系统visual c++编程
评论
共有 条评论