資源簡介
用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? 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個文件信息
評論
共有 條評論