资源简介
自己实现的编译原理的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\li
文件 3266 2018-12-10 16:05 Project4\Project4\Debug\Project4.tlog\li
文件 476 2018-12-10 16:05 Project4\Project4\Debug\Project4.tlog\li
文件 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个文件信息
- 上一篇:NXopen API 中文帮助文档
- 下一篇:cfree5.0破解版
相关资源
- C++餐厅管理系统源代码
- mqtt-client MFC工程调用开源代码
- PL/0语言编译器源代码及测试代码
- Cocos2d-x实战:C++卷2版源代码
- vc++ 编程宝典(十年典藏版) 书后光
- Visual C++网络编程郑阿奇源代码+PPT
- 编译原理之算符优先算法-迭代法
- 编译原理词法分析器实验报告含源代
- C++程序设计经典300例源代码
- 车牌识别系统源代码
- 何斌Visual C++数字图像处理第二版原书
- 《C++游戏开发》笔记十一 平滑动画
- 《MFC游戏开发》笔记十 碰撞检测 配套
- 《MFC游戏开发》笔记三 透明贴图 配套
- 《MFC游戏开发》笔记八 粒子系统 配套
- C++编写中国象棋源代码
- 钱能C++程序设计教程 PDF、课件及源代
- c++程序设计第四版课件郑莉等著[含
- modbus 客户端主站C++源代码
- 编译原理词法分析器C++版源代码
- Visual C++ MFC 源代码大全
- 《C++游戏开发》笔记十二 战争迷雾的
- 《MFC游戏开发》笔记九 碰撞检测 怪物
- 源代码——MFC的WebBrowser控件 C++与ja
- 无线通信系统仿真--C++实用模型包含源
- vc++之mfc屏幕监控系统源代码
- 《C++游戏开发》笔记十四 平滑过渡的
- C++ Builder 6实用编程100例光盘、源代码
- C++ Builder 5高级编程精解光盘、源代码
- Visual C++/Turbo C串口通信编程实践第2版
评论
共有 条评论