• 大小: 971KB
    文件类型: .rar
    金币: 2
    下载: 0 次
    发布日期: 2024-02-12
  • 语言: C/C++
  • 标签: tiny+  编译器  c++  

资源简介

用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.embed.manifest

     文件        728  2010-11-10 22:33  mybianyi\mybianyi\Debug\mybianyi.exe.embed.manifest.res

     文件        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个文件信息

评论

共有 条评论