资源简介
编译原理课程设计。
里面附有完整的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个文件信息
相关资源
- 编译原理课程实验常州工学院,比较
- 编译原理教材清华大学版答案
- 编译原理_Tiny+语法分析
- 编译原理综合课程设计
- 编译原理课后习题答案 清华大学 第二
- 编译原理课件_本科版
- 川大编译原理PPT-2017
- 编译原理课程设计
- 编译原理-Oberon-0逆向工程工具ROSE.ra
- 上海大学计算机编译原理PPT
- 编译原理期末考试题
- 编译原理四元式生成
- 布尔表达式的递归下降翻译程序设计
- 编译原理_第二版_李文生.pdf
- 清华大学编译原理decaf实验pa1
- 广东工业大学编译原理课程设计
- 编译原理课程设计源代码和超强报告
- 编译原理习题答案
- 编译原理赋值语句的翻译
- 编译原理课件 北邮
- 北邮编译原理实验二:语法分析程序
- 西电 编译原理上级报告
- 词法分析器+语法分析器+中间代码生成
- 编译原理 王生原老师答案和资料
- 编译原理-学习指导与典型题解析高清
- 编译原理---简易C编译器 生成汇编语言
- 词法分析程序和语法分析程序 编译原
- 编译原理_清华_吕映芝
- 西电编译原理上机
- 编译原理张晶版答案
评论
共有 条评论