資源簡介
最近在教學生編譯原理的入門,自己用了一周時間用c++寫了這個詞法分析器和語法檢查器,供后來者參考。代碼在vs2008中編譯運行通過。提供了10個測試文件。
本代碼用遞歸子程序法檢查所給文件是否合乎語法,不做語義分析和代碼生成以及模擬。

代碼片段和文件信息
#include?“FirstSymbols.h“
static?void?insertsym(const?symbol?table[]?int?nsymset&?syms)
{
for(int?i=0;?i syms.insert(table[i]);
}
CFirstSymbols::CFirstSymbols(void)
{
makestatbeg();
makesubbeg();
makeprogbeg();
makerops();
addops.insert(plus);
addops.insert(minus);
mulops.insert(times);
mulops.insert(slash);
makeexp();
condition?=?expression;
condition.insert(oddsym);
}
CFirstSymbols::~CFirstSymbols(void)
{
}
void?CFirstSymbols::makerops()
{
const?symbol?table[]=
{
eql
neq
lss
leq
gtr
geq
}
;
insertsym(tablesizeof(table)/sizeof(table[0])?rops);
}
void?CFirstSymbols::makestatbeg()
{
//語句的開頭只能id和6個關鍵字之一:begin?call?if?while?read?write
const?symbol?table[]=
{
ident
beginsym
callsym
ifsym
whilesym
readsym
writesym
}
;
insertsym(table?sizeof(table)/sizeof(table[0])?statement);
}
void?CFirstSymbols::makesubbeg()
{
sub?=?statement;??//語句的首部也可能是子程序的首部
//把每種聲明的first集加入子程序中
const?symbol?table[]=
{
constsym
varsym
procsym
};
insertsym(table?sizeof(table)/sizeof(table[0])?sub);
}
void?CFirstSymbols::makeprogbeg()
{
prog?=?sub;??//第一個子程序的首部也是主程序的首部
prog.insert(period); //因為子程序可能是空,所以句點也可能是程序的首部
}
const?symset&?CFirstSymbols::getstat()?const
{
return??statement;
}
const?symset&?CFirstSymbols::getprog()?const
{
return?prog;
}
const?symset&?CFirstSymbols::getsub()?const
{
return?sub;
}
const?symset&?CFirstSymbols::getexp()?const{
return?expression;
}
void?CFirstSymbols::makeexp()
{
factor.insert(ident);
factor.insert(number);
factor.insert(lparen);
expression=addops;
expression.insert(factor.begin()?factor.end());
}
const?symset&?CFirstSymbols::getrops()?const
{
return?rops;
}
const?symset&?CFirstSymbols::getmulops()?const
{
return?mulops;
}
const?symset&?CFirstSymbols::getraddops()?const
{
return?addops;
}
const?symset&?CFirstSymbols::getfactor()?const
{
return?factor;
}
const?symset&?CFirstSymbols::getcondition()?const
{
return?condition;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
????.......?????????1??2006-11-20?00:11??PL0\ClassDiagram1.cd
?????文件???????7072??2013-02-27?23:38??PL0\Debug\BuildLog.htm
?????文件?????219069??2013-02-27?23:07??PL0\Debug\FirstSymbols.obj
?????文件??????24773??2013-02-25?09:00??PL0\Debug\ID.obj
?????文件?????340084??2013-02-25?22:10??PL0\Debug\IDKind.obj
?????文件??????62896??2013-02-25?17:04??PL0\Debug\IDtable.obj
?????文件???????3174??2013-02-25?08:15??PL0\Debug\Instruction.obj
?????文件??????51609??2013-02-25?08:53??PL0\Debug\Instructions.obj
?????文件??????47311??2013-02-27?23:38??PL0\Debug\main.obj
?????文件?????????69??2013-02-27?23:38??PL0\Debug\mt.dep
?????文件?????349074??2013-02-25?22:10??PL0\Debug\OpKind.obj
?????文件?????107812??2013-02-27?23:38??PL0\Debug\Parser.obj
?????文件?????164352??2013-02-27?23:38??PL0\Debug\PL0.exe
?????文件????????663??2013-02-23?21:13??PL0\Debug\PL0.exe.em
?????文件????????728??2013-02-23?21:13??PL0\Debug\PL0.exe.em
?????文件????????621??2013-02-27?23:38??PL0\Debug\PL0.exe.intermediate.manifest
?????文件?????745152??2013-02-27?23:38??PL0\Debug\PL0.ilk
?????文件?????481992??2013-02-24?11:49??PL0\Debug\PL0.obj
?????文件????1838080??2013-02-27?23:38??PL0\Debug\PL0.pdb
?????文件??????41543??2013-02-27?23:03??PL0\Debug\Scanner.obj
?????文件?????155104??2013-02-26?20:06??PL0\Debug\SymbolSeqs.obj
?????文件??????30225??2013-02-26?17:11??PL0\Debug\Token.obj
?????文件???????3150??2013-02-24?17:53??PL0\Debug\TokenKind.obj
?????文件???????3150??2013-02-24?17:53??PL0\Debug\Transalor.obj
?????文件?????379904??2013-02-27?23:38??PL0\Debug\vc90.idb
?????文件?????643072??2013-02-27?23:38??PL0\Debug\vc90.pdb
?????文件???????2233??2013-02-27?23:06??PL0\FirstSymbols.cpp
?????文件????????726??2013-02-27?08:37??PL0\FirstSymbols.h
?????文件????????176??2013-02-25?09:00??PL0\ID.cpp
?????文件????????377??2013-02-25?08:59??PL0\ID.h
............此處省略38個文件信息
評論
共有 條評論