资源简介
最近在教学生编译原理的入门,自己用了一周时间用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个文件信息
相关资源
- LL(1)语法分析器C++版
- 编译技术实验(Pascal代码转汇编语言
- LR(0)语法分析器程序
- TINY扩充语言的语法分析(实现 while、
- 编译原理课程设计词法语法分析器
- 编译原理LL1语法分析器C++版源代码
- LEX实现一个C语言子集的词法分析器
- 编译原理词法分析器实验报告含源代
- 编译原理词法分析器C++版源代码
- 无符号数的词法分析程序 C++版
- 第四次上机作业 语法分析2
- 对于任意给定的输入串词法记号流进
- 编译原理课程设计LR(0)语法分析器
- LL1语法分析程序设计
- LEX与YACC实现C语言词法分析和语法分析
- 编译原理 词法分析器
- 简易C语言编译器的设计与实现
- 编译原理综合性实验 选择部分C语言的
- 编译器前两步
- 编译原理实验语法分析器
- 实验一:词法分析程序c++
- PL/0语法分析程序
- 词法分析器(c语言实现)246881
- cminus语法分析器源代码完整版
- 语法分析C实现
- 编译原理--语法分析 实验 C++版
- LL(1)文法自动生成语法分析程序的
- 编译原理 词法分析 源代码
- c语言写的编译器
- 词法分析C++程序
评论
共有 条评论