资源简介

编译原理课程设计。 里面附有完整的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个文件信息

评论

共有 条评论