资源简介

自己实现的编译原理的LL1语法分析器,是自己的实验作业,用Vs2017实现,可以直接运行,代码注释丰富,希望与大家交流学习!欢迎大家下载!

资源截图

代码片段和文件信息

#include  
#include  
#include  
#include  
#include  
#include 
#include 

#define MAX 100 
using namespace std;

// 产生式的数据结构
struct node
{
char left; //左部一个非终结符字母
string right; //右部一个字符串
};

static int T;
static node Pro[MAX]; // 产生式

//set的特性是,所有元素都会根据元素的键值自动排序
//vector 是向量类型,它可以容纳许多类型的数据
static set firstSet[MAX]; // First集 
static set followSet[MAX]; // Follow集 
static vector terminal; // 终结符 
static vector terminalN; // 去空的终结符 
static vector nonterminal; // 非终结符
static vector analyticalS; // 分析栈 
static vector RemainE; // 剩余输入串 
static int forecastAnaly[100][100]; // 预测表 

//判断是否为非终结符
bool IsNonterminal(char c)

if (c >= ‘A‘ && c <= ‘Z‘)
return true;
return false;
}

// 获得非终结符集合中的元素下标 
int GetindexN(char c)
{
for (int i = 0; i < nonterminal.size(); i++)
{
if (c == nonterminal[i])
return i;
}
return -1;
}

// 获得终结符集合中的元素下标 
int Getindex(char c)

for (int i = 0; i < terminalN.size(); i++)
{
if (c == terminalN[i])
return i;
}
return -1;
}

// 求非终结符X的的First集
void GFirstSet(char X)
{
int countEmpty = 0; // 用于最后判断右部非终结符的First集中,是不是都含有$
int hasEmpty = 0;//First(X)集中是否含有$
int Xindex = GetindexN(X);//非终结符在非终结符表中的位置
for (int i = 0; i < T; i++)
{
// 匹配产生式左部
if (Pro[i].left == X)
{
// 右部第一个符号若为终结符,直接加入first集 
if (!IsNonterminal(Pro[i].right[0]))
{
firstSet[Xindex].insert(Pro[i].right[0]);
}
else
{
// 产生式为X->Y1..Yj..Yk形式
for (int j = 0; j < Pro[i].right.length(); j++)
{
char Yj = Pro[i].right[j];//Yj为产生式右部的符号(可能为终结符也可能为非终结符)

// 若Yj是终结符(不能产生$)则加入First(X)集后,立刻跳出循环 
if (!IsNonterminal(Yj))

firstSet[Xindex].insert(Yj);
break;
}

// 若Yj是非终结符,递归求出First(Yj) 
GFirstSet(Yj);
int YjIndex = GetindexN(Yj);//找到Yj在非终结符表中的下标

//将Yj的First集中的非空的终结符加入First(X)中
set::iterator it;//迭代器变量
for (it = firstSet[YjIndex].begin(); it != firstSet[YjIndex].end(); it++)
{
if (*it == ‘$‘) // 遍历查看First(Yj)中是否含有‘$‘(能产生空) 
hasEmpty = 1;
else
firstSet[Xindex].insert(*it);//将FIRST(Yj)中的非$就加入FIRST(X) 
}

// Yj不能产生空 迭代结束 
if (hasEmpty == 0)
break;
//  Yj能产生空继续进行迭代运算,并累加到countEmpty中
else 

countEmpty += hasEmpty;
hasEmpty = 0;
}
}
//所有右部first(Y)都有$则将$加入First(X)中 
if (countEmpty == Pro[i].right.length())
firstSet[GetindexN(X)].insert(‘$‘);
}
}
}
}

// 求非终结符X的的Follow集
void GFollowSet(char X)
{
int Xindex = GetindexN(X);//非终结符在非终结符表中的位置
for (int i = 0; i < T; i++)
{
int index = -1;//index为非终结符X在产生式Pro[i]中右部的位置,初始化为-1

int len = Pro[i].right.length();//产生式Pro[i]中右部的长度

// 寻找X在产生式中的位置index 
for (int j = 0; j < len; j++)

if (Pro[i].right[j] == X)
{
index = j;
break;
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    ..A..H.     25600  2019-01-05 13:30  Project4\.vs\Project4\v15\.suo

     文件   37117952  2019-01-05 13:30  Project4\.vs\Project4\v15\Browse.VC.db

     文件   40108032  2019-01-05 13:30  Project4\.vs\Project4\v15\ipch\AutoPCH\a9a3c0dc9b480300\LL1.ipch

     文件     210944  2018-12-10 16:05  Project4\Debug\Project4.exe

     文件    2145960  2018-12-10 16:05  Project4\Debug\Project4.ilk

     文件    1650688  2018-12-10 16:05  Project4\Debug\Project4.pdb

     文件     727675  2018-12-10 16:05  Project4\Project4\Debug\LL1.obj

     文件       2475  2018-12-10 16:05  Project4\Project4\Debug\Project4.log

     文件        732  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog\CL.command.1.tlog

     文件      21038  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog\CL.read.1.tlog

     文件        496  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog\CL.write.1.tlog

     文件       1146  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog\link.command.1.tlog

     文件       3266  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog\link.read.1.tlog

     文件        476  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog\link.write.1.tlog

     文件        217  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog\Project4.lastbuildstate

     文件     175104  2018-12-10 16:05  Project4\Project4\Debug\vc141.idb

     文件     536576  2018-12-10 16:05  Project4\Project4\Debug\vc141.pdb

     文件      12597  2018-12-10 16:05  Project4\Project4\LL1.cpp

     文件       6062  2018-12-09 18:54  Project4\Project4\Project4.vcxproj

     文件        948  2018-12-05 10:54  Project4\Project4\Project4.vcxproj.filters

     文件        165  2018-12-05 10:46  Project4\Project4\Project4.vcxproj.user

     文件         44  2018-12-09 19:22  Project4\Project4\resource.txt

     文件       1438  2018-12-05 10:46  Project4\Project4.sln

     目录          0  2018-12-09 19:14  Project4\.vs\Project4\v15\ipch\AutoPCH\a9a3c0dc9b480300

     目录          0  2018-12-05 10:47  Project4\.vs\Project4\v15\ipch\AutoPCH

     目录          0  2018-12-05 10:47  Project4\.vs\Project4\v15\ipch

     目录          0  2019-01-05 13:30  Project4\.vs\Project4\v15

     目录          0  2018-12-10 16:05  Project4\Project4\Debug\Project4.tlog

     目录          0  2018-12-05 10:46  Project4\.vs\Project4

     目录          0  2018-12-10 16:05  Project4\Project4\Debug

............此处省略7个文件信息

评论

共有 条评论