资源简介

最近在教学生编译原理的入门,自己用了一周时间用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.embed.manifest

     文件        728  2013-02-23 21:13  PL0\Debug\PL0.exe.embed.manifest.res

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

评论

共有 条评论