当前位置:网站首页>基于C语言实现的LL(1)分析
基于C语言实现的LL(1)分析
2022-07-29 14:23:00 【biyezuopinvip】
LL(1)分析
一、实验任务
存储文法;
计算给定文法所有非终结符的 FIRST 集合;
计算给定文法所有非终结符的 FOLLOW 集合;
构造该文法的 LL(1) 文法的分析表
根据 LL(1) 分析表判断文法是否 LL(1) 文法;
完成完整的 LL(1) 分析过程。
二、实验内容
确定文法的文件存储格式,存储文法的非终结符集合、开始符号、终结符集合和产生式规则集合。
要求为 3 个以上测试文法准备好相应的存储文件。
计算给定文法所有非终结符的 FIRST 集合。
计算给定文法所有非终结符的 FOLLOW 集合;
确定 LL(1) 分析表的文件存储格式。
要求为 3 个以上测试文法准备好相应 LL(1) 分析表的存储文件。
根据 LL(1) 分析表判断文法是否 LL(1) 文法。
看每个表项是否最多只有一条候选式,如是该文法是 LL(1) 文法。
实现 LL(1) 分析过程。
当 5. 判断出该文法是 LL(1) 文法时,要求给出 3 个以上输入串的 LL(1) 分析过程,并判断输入串是否该文法的合法句子。
完成完整的 LL(1) 分析过程。
三、存储格式
- 文法
E->TE`
E`->+TE`|e
T->FT`
T`->*FT`|e
F->(E)|id
- 改变
E`用Y代替
T`用X代替
- 非终结符号
EYTXF
- 文法改写存储
E,TY
Y,+TY
Y,e
T,FX
X,*FX
X,e
F,(E)
F,i
- 分析表用一个结构体的二维数组存储,会很复杂,看代码理解。
四、程序设计
- 结构体类
struct.h
注意理清里面的结构体嵌套。
# include <string>
# ifndef MAXNUM
# define MAXNUM 100
# endif
# ifndef _STRUCT_H
# define _STRUCT_H
/******数据定义******/
struct rule
{ //一个文法
std::string startSymbol; //开始符号
std::string tuidao; //推导式
};
struct record{ //记录一个终结符号由那些产生式得出的
int num=0; //数量
int gramNum[MAXNUM]; //产生式的编号
};
struct set
{ //集合
char startSymbol; //非终结符
char set[MAXNUM]; //frist or follow集合
record gramNum[MAXNUM]; //记录一个终结符号是由哪些文法推导出的
int num = 0;
bool isExistE = false; //是否存在空串
};
struct tableCell{ //预测分析表的一个单元
int num=0;
rule cell[MAXNUM];
bool error=true;
};
# endif
- 获得
first和follow集文法类getFirFol.h
# include "getFirFol.h"
# include "struct.h"
# ifndef _LL_H
# define _LL_H
class LL{
public:
LL(getFirst_Follow *ff,std::string ts, std::string nts, std::string rl);
/***构造分析表***/
void fillInTheTable();
/***分析字符串***/
void analyzeChars(std::string path);
/***在对应的分析表单元格加入文法***/
bool addInTableCell(int h,int l,int gramNum);
private:
getFirst_Follow *getff;
std::string terSymbol; //终结符号集合
int tsLength=0; //终结符号数量
std::string nonTerSymbol; //非终结符号集合
int ntsLength=0; //非终结符号数量
rule *grammer = NULL; //文法
int gramNum = 0; //文法公式数目
tableCell **analyzeTable; //预测分析表
bool isLLGrammer=true; //判断是为LL(1)文法
};
# endif
- 主函数
main.cpp
# include"getFirFol.h"
# include"LL.h"
# include<iostream>
# include<string>
# include<queue>
# include<fstream>
using namespace std;
int main(){
string ts="test1\\terminalSymbol.ll";
string nts="test1\\nonTerminalSymbol.ll";
string rl = "test1\\rule.ll";
string path="test1\\input1.ll";
getFirst_Follow gff(ts,nts,rl);
gff.getFirst();
gff.getFollow();
LL ll(&gff,ts,nts,rl);
ll.fillInTheTable();
ll.analyzeChars(path);
system("pause");
return 0;
}
五、实验测试
- 文法分析结果

LL(1)分析结果
1)输入串
i+i*i
2) 分析

边栏推荐
猜你喜欢

潘多拉 IOT 开发板学习(RT-Thread)—— 实验19 MQTT 协议通信实验(学习笔记)

基于JSP&Servlet实现的众筹平台系统

Guangzhou Emergency Management Bureau released the top ten safety risks of hazardous chemicals in summer

EA&UML日拱一卒-活动图::Object actions(续)

84.(cesium之家)cesium模型在地形上运动

iMedicalLIS监听程序(1)

leetcode linked list topic

换掉 UUID,更快、更安全!

EA&UML日拱一卒-活动图::CallOperationAction(续)

广州市应急管理局发布夏季危化品十大安全风险
随机推荐
函数柯里化
教育部等五部门联合推荐优质课外资源,腾讯产品青少年模式首发
Zhaoqi Technology creates a platform for overseas high-level talent introduction, corporate project docking, and event roadshows
Bika LIMS 开源LIMS集—— SENAITE的使用(用户、角色、部门)
PytestFixture实战应用+Pytest.ini与conftest.py应用详解+Fixture及yield实现用例前置后置
兆骑科创海外高层次人才引进平台,企业项目对接,赛事活动路演
EA&UML日拱一卒-活动图::Feature和StuctualFeature
C#线程操作UI控件
这 6 款在线 PDF 转换工具,得试试
这个 MySQL bug,99% 的人会踩坑!
第4章_3——索引的使用
上线前配置
EA&UML日拱一卒-活动图::Variable Actions(续)
TCP流量控制和拥塞控制
搞直播啦,千视超高清4K NDI编解码器8月3日19:00准时开播
正则、grep/egrep、sed、awk
你会看 MySQL 的执行计划(EXPLAIN)吗?
【JS面试题】面试官问我:遍历一个数组用 for 和 forEach 哪个更快?
立足本土,链接全球 | 施耐德电气“工业SI同盟”携手伙伴共赴未来工业
rosbag数据画图MATLAB