资源简介
用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个文件信息
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 编译原理c语言编译器
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
评论
共有 条评论