资源简介
编译原理课程设计。
里面附有完整的C Minus词法分析器和语法分析器。
代码注释相当详细!
并且附有课程设计的报告。
词法分析器采用表驱动构造。
语法分析器采用LL1,文法为手动输入的文件,即可处理多种不同的文法。并生成相应的分析表,根据输入待分析文件生成对应的抽象语法树。
看了觉得不错一定给好评哦!

代码片段和文件信息
#include “globals.h“
/*构造LL(1)分析表*/
void buildMTable()
{
int i j k x = 0 ;
buildProductFirstSet();
/*对每个产生式*/
for ( i = 0 ; i < productNum ; i++)
{
j = k = 0 ;
string alpha = iniProduct[i].generation[0] ;
//printf(“第%d个产生式:%s->%s\t\t“iiniProduct[i].noneTerminalName.c_str()alpha.c_str());
for (set::iterator ite = proFirstSet[i].begin() ; ite != proFirstSet[i].end() ; ite++)
{
/*对于First(alpha)中的每个记号a,都将改production添加到M[Aa]中*/
MTable[iniProduct[i].noneTerminalName][ite->c_str()] = production[i] ;
j++;
x++;
}
/*empty在first(alpha)中则对于follow[A]中的每个元素p,都将M[A][p]=production*/
if( proFirstSet[i].find(“empty“) != proFirstSet[i].end() )
{
for( set::iterator ii = followSet[iniProduct[i].noneTerminalName].begin() ;
ii != followSet[iniProduct[i].noneTerminalName].end() ; ii++)
{
/*
语法:
1.selection-stmt-1 -> else statement
2.selection-stmt-1 -> empty
跳过2的处理,避免1的到的MTable[“selection-stmt-1“][“else“]被覆盖
*/
if(iniProduct[i].noneTerminalName == “selection-stmt-1“ && *ii == “else“) continue;
MTable[iniProduct[i].noneTerminalName][ii->c_str()] = production[i] ;
k++;
x++;
}
}
//printf(“sum:%d%d\n“jk);
}
//printf(“total:%d\n“x);
}
/*构造产生式的First集合*/
void buildProductFirstSet()
{
int i j ;
for ( i = 0 ; i < productNum ; i++)
{
bool hasEmpty = true ;
for( j = 0 ; hasEmpty && j < iniProduct[i].generation.size() ; j++)
{
for( set::iterator ite = firstSet[iniProduct[i].generation[j]].begin() ;
ite != firstSet[iniProduct[i].generation[j]].end() ; ite++)
proFirstSet[i].insert(*ite);
if( firstSet[iniProduct[i].generation[j]].find(“empty“) == firstSet[iniProduct[i].generation[j]].end() )
{
hasEmpty = false ;
/*跳出!!!很重要*/
break;
}
}
if( j == iniProduct[i].generation.size() ) proFirstSet[i].insert(“empty“);
}
}
/************************************************************************/
/* 构建语法树 */
/* 1.语法分析得到token序列,存放在char tokenlist[][]中 */
/* 2.根据token序列,分析栈,MTable模拟即可 */
/************************************************************************/
void buildTree()
{
/*将$添加到tokenList的结尾*/
strcpy(tokenList[tokenNum]“$“);
tokenNum++;
int i j ;
tNode* temp ;
/*将$和开始字符push进分析栈*/
top = 0 ;
pushParsingStk(“$“new tNode(“$“));
pushParsingStk(startToken.c_str()new tNode(startToken.c_str()));
pRoot = getTopNode();
i = 0 ;
while(1)
{
if( tokenList[i][0] == 0 ) { i++; continue; }
if( strcmp(parsingStk[top-1]“$“) == 0 ) break;
/*if the top of the parsing stack is terminal a then match */
if ( terminal.find(parsingStk[top-1]) != terminal.end() )
{
/*匹配*/
if( strcmp(parsingStk[top-1]tokenList[i]) == 0 )
{
popParsingStk();
i++;
}
else /*匹配失败,符号串不是文法
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2012-06-07 08:46 C Minus语法分析器\
文件 23643 2012-06-03 18:04 C Minus语法分析器\AnalyseTable.htm
文件 8956 2012-06-07 08:45 C Minus语法分析器\buildSet.cpp
文件 262 2012-06-03 17:10 C Minus语法分析器\c1.txt
文件 679 2012-05-21 14:41 C Minus语法分析器\c2.txt
文件 51 2012-05-21 15:24 C Minus语法分析器\c3.txt
文件 83 2012-06-03 18:03 C Minus语法分析器\c4.txt
文件 151 2012-05-19 15:26 C Minus语法分析器\calGrammar.txt
目录 0 2012-06-07 08:46 C Minus语法分析器\Debug\
文件 469695 2012-05-21 17:29 C Minus语法分析器\Debug\buildSet.obj
文件 206 2012-05-19 15:36 C Minus语法分析器\Debug\delLRCMinus.txt
文件 194498 2012-05-21 17:31 C Minus语法分析器\Debug\iniGrammar.obj
文件 1823 2012-05-18 11:38 C Minus语法分析器\Debug\inputGrammar.txt
文件 737359 2012-05-21 17:31 C Minus语法分析器\Debug\LL1.exe
文件 1181088 2012-05-21 17:31 C Minus语法分析器\Debug\LL1.ilk
文件 289620 2012-05-18 12:23 C Minus语法分析器\Debug\ll1.obj
文件 3636912 2012-05-21 17:31 C Minus语法分析器\Debug\LL1.pch
文件 1770496 2012-05-21 17:31 C Minus语法分析器\Debug\LL1.pdb
文件 523241 2012-05-21 17:30 C Minus语法分析器\Debug\main.obj
文件 593056 2012-05-21 17:31 C Minus语法分析器\Debug\saveSth.obj
文件 101021 2012-05-21 17:31 C Minus语法分析器\Debug\scan.obj
文件 289629 2012-05-18 12:29 C Minus语法分析器\Debug\test.obj
文件 0 2012-05-19 00:42 C Minus语法分析器\Debug\testdellr.txt
文件 18 2012-05-19 00:39 C Minus语法分析器\Debug\testlr.txt
文件 209159 2012-05-21 17:31 C Minus语法分析器\Debug\util.obj
文件 197632 2012-05-21 17:37 C Minus语法分析器\Debug\vc60.idb
文件 266240 2012-05-21 17:31 C Minus语法分析器\Debug\vc60.pdb
文件 2702 2012-06-03 18:04 C Minus语法分析器\delLRCMinus.txt
文件 2170 2012-06-03 18:04 C Minus语法分析器\FirstSet.txt
文件 1912 2012-06-03 18:04 C Minus语法分析器\FollowSet.txt
文件 4527 2012-05-21 15:58 C Minus语法分析器\globals.h
............此处省略46个文件信息
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译词法分析器识别关键字常数和符
- SAMPLE (类pascal) 词法分析程序 C 版
- Delphi做的用于分析Pascal语言的词法分
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- pl/0编译器 语法分析
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- TINY+编译器 改编自原版TINY
- 编译原理课程设计 while do循环语句翻
评论
共有 条评论