【编译原理】LL1文法语法分析器

LR(0) 文法分析器 实验代码实验结果读入的文法和加上点后的文法: LR(0)分析表: 分析过程: 阅读详情

【编译原理】LL1文法语法分析器

作者:杨博东的博客 
原文:https://blog.youkuaiyun.com/yangbodong22011/article/details/53415401 

上篇文章 【编译原理】语法分析——自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去。

说明:

这个语法分析器是利用LL1分析方法实现的。
预测分析表和终结符以及非终结符都是针对一个特定文法定义好的。
输入的分析串必须以 # 开头和结尾。

原始文法:

E -> E + T | T
T -> T * T | F
F -> (E) | i

消除左递归之后:

E -> TE'
E' -> +TE' | e
T -> FT'
T' -> *FT' | e
F -> (E) | i

//备注 
e 表示 一步赛楞
E' 在实际程序中用Z代替
T' 在实际程序中用Y代替

程序如下:

// LL2.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<cstdlib>
#include<vector>
#include<string>
#include<stack>

#define BEGIN_SYB 'E'

class Tab {                   //预测分析表中单个产生式
public:
	Tab(char n, char e, std::string p) :noend(n), end(e), prod(p) {};

	char noend;
	char end;
	std::string prod;
};

std::vector<Tab>  pTab;       //预测分析表
std::stack<char>  pStack;     //栈
std::string       pStr;       //输入串
int               index = 0;  //输入串的下标
int               num = 0;    //下标
char              X;          //从栈顶取出的符号
char              a;          //字符串目前分析到的位置
std::vector<char> VT{ 'i','+','*','(',')','#' };    //终结符号集合
std::vector<char> VN{ 'E','Z','T','Y','F' };    //非终结符号集合

int
isPartVT(char ch)
{
	for (auto u : VT) {
		if (u == ch) {
			return 1;
		}
	}
	return 0;
}

int
isPartVN(char ch)
{
	for (auto u : VN) {
		if (u == ch) {
			return 1;
		}
	}
	return 0;
}

void
initpTab()
{
	pTab.push_back(Tab('E', 'i', "TZ"));       //Z表示E'
	pTab.push_back(Tab('E', '(', "TZ"));
	pTab.push_back(Tab('Z', '+', "+TZ"));
	pTab.push_back(Tab('Z', ')', "$"));
	pTab.push_back(Tab('Z', '#', "$"));
	pTab.push_back(Tab('T', 'i', "FY"));
	pTab.push_back(Tab('T', '(', "FY"));       //Y表示T'
	pTab.push_back(Tab('Y', '+', "$"));
	pTab.push_back(Tab('Y', '*', "*FY"));
	pTab.push_back(Tab('Y', ')', "$"));
	pTab.push_back(Tab('Y', '#', "$"));
	pTab.push_back(Tab('F', 'i', "i"));
	pTab.push_back(Tab('F', '(', "(E)"));
}

void
printStack()
{
	std::stack<char> pTemp(pStack);
	while (pTemp.size() != 0) {
		std::cout << pTemp.top() << " ";
		pTemp.pop();
	}
	std::cout << "         ";
}

int
synaly()
{
	pStack.push(pStr[index++]);
	pStack.push(BEGIN_SYB);
	a = pStr[index++];
	bool flag = true;
	while (flag) {
		std::cout << num++ << "        ";  //输出行号
		printStack();
		if (pStack.size() != 0) {
			X = pStack.top();              //将符号栈顶给X
			pStack.pop();
		}

		if (isPartVT(X)) {                  //如果是终结符
			if (X == '#' && a == '#') {
				flag = false;
			}
			else if (X == a) {
				std::cout << std::endl;
				a = pStr[index++];
			}
			else {
				std::cout << "EROOR!" << std::endl;
				return 0;
			}

		}
		else if (X == '#') {
			if (X == a) {
				flag = false;
			}
			else {
				std::cout << "EROOR!" << std::endl;
				return 0;
			}

		}
		else if (isPartVN(X) && isPartVT(a)) {  //如果非终结符
			int type = 0;
			for (auto u : pTab) {
				if (u.noend == X && u.end == a) {
					std::string tempProd = u.prod;
					std::cout << X << "->" << tempProd << std::endl;
					if (tempProd == "$") {
						type = 1;
						break;
					}
					else {
						for (int i = tempProd.size() - 1; i >= 0; --i) {
							pStack.push(tempProd[i]);
						}
						type = 1;
						break;
					}
				}
			}
			if (type != 1) {
				std::cout << "EROOR!" << std::endl;
				return 0;

			}

		}
		else {
			std::cout << "EROOR!" << std::endl;
			return 0;
		}

	}
	return 1;
}

int main(int argc, char *argv[])
{
	initpTab();
	std::cout << "请输入语法串:";
	std::cin >> pStr;
	std::cout << "步骤" << "     " << "符号栈" << "      " << "所用产生式" << std::endl;
	int flag = synaly();
	std::cout << std::endl;
	if (flag == 1) {
		std::cout << "分析成功~~" << std::endl;
	}
	else {
		std::cout << "分析失败~~" << std::endl;
	}
	system("pause");
	return 0;
}

 


 

什么是LL(1)、LR(0)、LR(1)文法、LR分析表—编译原理 SLR(1)、LR(1)、LALR(1)文法之间的关系,什么是LL(1)、LR(0)、LR(1)文法,什么是句柄、什么是自上而下、自下而上分析,何时需要消除左递归,如何消除左递归,如何判断二义文法及消除文法二义性,什么是上下文无关文法、最左推导和最右推导 阅读详情

相关推荐

编译原理-python实现LL(1)分析器(GUI界面tkinter,自动分析文法)

原理 本次实验是设计一个LL(1)分析器,给定任意文法,自动消除一切左递归(前提是文法中不含回路,且产生式右部不含有空字),自动回溯(提取最左公因子),自动生成FIRST集,自动生成FOLLOW集,自动生成LL(1)分析表,给定一个输入串,输出该输入串的分析过程。 本次实验需要的原理知识在此不过多阐述,可以参考《编译原理教程》第四版(胡元义主编) 需要注意的是,书本上自动消除一切左递归的算法中,我认为会出现第一个产生式的直接左递归没有消除(不知道对不对,看两层循环中中第一个产生式没有消除直接左递

weixin_42100456的博客 2492

C++实现文法分析器(Chomsky 文法分类 完整源码)

本文将介绍一个基于C++语言实现的文法分析器,该文法分析器是一份编译原理实验作业的成果。通过本文的阅读,您将会了解到如何使用C++语言来实现一个基本的文法分析器,并且了解文法分析器的基本原理和实现方法。该程序的主要思路是将输入的产生式转换为文法,然后通过判断文法的特征来确定其是否为0-3型文法,并输出对应信息。最后,将文法转换为四元组形式输出。代码是按照老师给的判定要求来写的,如果规则不一样,可以自己修改一下。由于比较复杂,需要分别判断右部符号的数量和类型。函数将文法转换为四元组形式输出。

qq_57495370的博客 1575

编译原理: 做一个LL(1)语法分析器

本文实现了简易语法分析器老规矩,先贴结果新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 老规矩,先贴结果 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,

Bawei_的博客 4153

语法分析器

语法分析器是一种计算机软件,它的作用是将输入的文本进行语法分析,并在发现语法错误时报告错误。通常,语法分析器会根据给定的语法规则,将文本分成若干个结构相对简单的子句,并在此基础上进行进一步的编译或解释。语法分析器通常是编译器或解释器的组成部分,它们被用于处理各种编程语言或脚本语言的代码。 ...

weixin_42611310的博客 2102

C-语言词法分析器与语法分析器(二)

说明: 为实践《编译原理》中的相关知识,认真完成了课程设计,实现了C-语言的词法分析器与语法分析器 C-语言是C语言的一个子集,语法包括: 整型变量与函数的声明 if else 分支语句 while 循环语句 本篇介绍语法分析器的实现 将利用将文法改写为LL(1)文法的技术实现语法分析器 流程: 去除左递归 提取左公因子 获取FIRST, FOLLOW集合 构造预测分析表 ...

IuSpet的博客 4161

简单的LL1文法分析器 编译原理作业

简单的LL1文法分析器 编译原理作业 简单的LL1文法分析器 编译原理作业

编译原理:LL(1)语法分析器的实现(内含代码详细注释)

自顶向下语法分析器的设计与实现 一、说明 这是一个简单的自顶向下语法分析程序——LL(1) 语法分析程序。自顶向下分析也称面向目标的分析方法,也就是从文法的开始符出发,试图推导出与输入单词串相匹配的句子。 预测分析法(LL(1)方法)的基本思想是:从文法开始符S 出发,从左到右扫描源程序,每次通过向前查看 1 个字符,选择合适的产生式,生成句子的最左推导。 二、程序功能及运行截图 功能...

kailang的博客 6万+

制造业批次管理中双计量单位动态转换的实践指南

本文详细介绍了制造业批次管理中双计量单位动态转换的实践指南,特别是在SAP系统中的配置与操作步骤。通过实际案例展示了如何解决采购与生产部门计量单位不一致的问题,提升物料管理效率。重点讲解了批次特性配置、移动类型调整及常见问题排查方法,适用于金属加工、化工等多个行业。

weixin_29228203的博客 159

实验四:SLR(1)分析生成器

浴帘求你了让我过

chaichai126的博客 2522

GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

前言 之前写了GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)一文。这次我们来看看GD32F303的USART是如何配置的,结合这两篇文章,相信大家GD32的USART配置流程会十分熟悉。 DMA 能大大减轻CPU负荷的东西,建议场景合适的情况下,都去用DMA功能。 USART 一种串行通信协议, ...

欢喜6666的博客 3万+

穿透鼠标实现后台点击,适用于任何窗口!【后台鼠标】【风雪】

也许你就是被这标题吸引来的,呵呵!好久没发帖了,勾引一下大家的胃口,当然有的人已经猜出原理了!既然来了,都要把原理学回家,不然就没意思了!很多游戏现在都不支持后台消息鼠标,要实现真的不是简单的,什么注入dll啊,什么hook俺也学不懂,那就简简单单另辟蹊径了下面来讲讲原理吧(下面的玩玩可以,用于实际不现实,俺也不藏了,看到这么多人回复,良心过意不去,呵呵)首先,将要点击的窗口上面覆盖的所有窗...

weixin_34129145的博客 1万+

编译原理之 LL1 语法分析器(Java)

前言:编译原理实验要求做一个语法分析器,所以才有了这个项目 语法分析器 实验要求 PS:这里其实还可以选择算符优先分析法和SLR(1)分析法做的,但是由于我对预测分析法比较熟悉,所以… 测试用例 文字版: //直接左递归 P——>Pa|b V——>Eabc|bc|Vabc|c E——>E+T|T T——>T*F|F F——>(E)|i //间接左递归 S——>i|h|c|t|Qc Q——>Rb|b R——>Ba|a B——>Cf|H C——&.

小关同学的博客 4660

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

编译原理-LL1语法分析器(消除左递归+消除回溯)

编译原理-LL1语法分析器(消除左递归+消除回溯) 实验要求: 要求一 1、 给出文法如下: G[E]: E-&gt;T|E+T; T-&gt;F|T*F; F-&gt;i|(E); 2、 根据该文法构造相应的LL(1)文法及LL(1)分析表,并为该文法设计预测分析程序,利用C语言或C++语言或Java语言实现; 3、 利用预测分析程序完成下列功能: 1) 手工将测试的表达式写入文本文件,每个表达...

Jamence的博客 3万+

告别手动打点计时:用Lauterbach TRACE32的RunTime功能,5分钟搞定嵌入式代码段性能分析

本文深入解析了Lauterbach TRACE32的RunTime功能在嵌入式代码性能分析中的革命性应用。通过硬件级计时原理和非侵入式设计,该功能能快速精确测量代码执行时间,显著提升开发效率,特别适用于汽车电子和工业控制领域。文章还提供了从基础设置到高级分析的完整实战指南,帮助工程师轻松掌握这一强大工具。

weixin_30615767的博客 280

《PLECS仿真与实战:从建模到高端应用》-专栏文件目录

《PLECS仿真与实战:从建模到高端应用》是一本系统介绍PLECS电力电子仿真软件的实用指南。全书共10章,首先介绍软件安装与基础操作,包括RC电路仿真等入门内容;随后深入讲解各类电力电子电路的建模与仿真,涵盖整流、交交变换、直流变换、逆变等电路;最后探讨PWM控制建模和直流调速系统等高端应用。书中配有丰富的示例程序和波形分析方法,附录还包含电力电子器件、代码生成等实用资料。该书适合电力电子领域工程师和学生系统学习电路仿真技术。

544

编译原理LL(1)语法分析器实现

废话不多说了,开源代码!要是觉得好的话点个star,作为辛苦费哈! LL(1)语法分析气的实现 要实现LL1文法,根据个人经验总结,需要以下步骤: 我没有实现间接左递归的消除,所以处理不了间接左递归文法。 下面我们来说一下实现过程。 输入相关文法,使用正则表达式将文法中的空串做了清除。 对文法消除直接左递归,使用以下方法: 要是检测到一条文法中出现以下情况: P->Pa|b 则这条...

changke的博客 1万+

视图库对接系列(GA-T 1400)四、视图库对接系列(本级)注册

在之前的步骤中,我们已经把项目大体的架构已经写出来了。那我们就来实现注册接口。GA-T 1400中的步骤如下:这里的话,我们实现的简单点, 我们不进去鉴权,也就是设备或平台找我们注册的话,我们直接返回成功,不进行验证。如果需要鉴权的话可看我的另外一篇文档。

qq_37716298的博客 1044

【编译原理】LL(1)分析法:C/C++实现

史上最全的编译原理之LL(1)分析法实验讲解汇总,这篇万字详解是您深入了解编译原理中LL(1)分析法的最佳选择!它提供了超全面、超详细的内容,从理论到实践,从基础到高级应用,无所不包。不仅仅是一篇教材,更是一本知识宝库,不容错过!无论您是编译原理的初学者还是研究者,这篇文章都将成为您的不可或缺的参考工具。立即将它加入收藏夹,确保不会错过这个宝贵的学习资源!

朝花夕拾 2万+

ESP32 DW1000 UWB 室内定位系统

详细介绍ESP32 DW1000 UWB 室内定位系统的设计演示demo。

DT程序员的博客 1662

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【编译原理】LL(1)语法分析器

1.项目要求文法要求:(1)从文件读入,每条产生式占用一行(2)文法为LL(1)文法从文件中读入文法,从键盘上输入待分析的符号串,采用 LL(1)分析算法判断该符号串是否为该文法的句子。2.实验思路:首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再根据FIRST和FOLLOW集合构造出预测分析表,并对指定的句子打印出分析栈的分析过程,判断是否为该文法的句子。3.实验原理(1...

老北京的热干面 7万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【编译原理】第4章 LL(1)文法及其分析程序

4 LL(1)文法及其分析程序 目录一、自顶向下分析的问题二、LL(1)文法FIRST集、FOLLOW集和SELECT集LL(1)文法定义LL(1)分析程序实现三、非LL(1)文法的改造 语法分析任务:在词法分析识别出单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则 分析算法分类(语法分析方法): 自上而下分析法:从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的最...

小羊咩咩的博客 6892

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

编译原理-5-LL(1)语法分析器

5-LL(1)语法分析器

SpriCoder的博客 1万+

编译原理:LL(1)文法 语法分析器(预测分析表法)

设计要求:对于任意输入的一个LL(1)文法,构造其预测分析表,并对指定输入串分析其是否为该文法的句子。 思路:首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再根据FIRST和FOLLOW集合构造出预测分析表,并对指定的句子打印出分析栈的分析过程,判断是否为该文法的句子。 指定文法: //文法 E->TK K->+TK K->$ T->FM M->*FM M

NK_test的博客 8万+

Java实现LL1语法分析器【编译原理】

Java实现LL1语法分析器【编译原理】

小心星的博客 3845
上一篇: LL(1)文法分析表的构造和分析过程示例
下一篇: 【算法】表达式求值--逆波兰算法介绍
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值