编译原理课程设计:语法分析器
配套代码:
编译原理课程设计:语法分析器-Python文档类资源-CSDN下载所使用的开发环境:Windows10、python(PyCharm)环境注意:expression更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/RLIRiong/85393593?spm=1001.2014.3001.5503
github:
https://github.com/Afaliya0-0Liong/Parser-https://github.com/Afaliya0-0Liong/Parser-
要求:
创建一个使用LR(1) 方法的语法分析程序,程序有两个输入:1)一个是文本文档,其中包含2º型文法(上下文无关文法)的产生式集合;2)任务1词法分析程序输出的(生成的)token令牌表。程序的输出包括:YES或NO(源代码字符串符合此2º型文法,或者源代码字符串不符合此2º型文法);错误提示文件,如果有语法错标示出错行号,并给出大致的出错原因。
开发环境:
Windows10、python(PyCharm)环境。
项目简介:
程序读入上下文无关文法,并进行拓广文法,将产生式依次形成项目进行储存,设定好起点进行处理得到完整的项目集族,按照项目集族之间的转换得到action、goto表,读取词法分析得到的token(详情看我的词法分析器,也可以按照我的格式进行自创,格式:(行数, token分类, token内容)),按照之前得到的action、goto表进行处理,得到语法分析的结果,查看是否符合自己设定的语法,如果出错可以形成缺失者错误导致的错误报告,并输出到result.txt(正确会得到‘YES’)。
相关数据结构:
该语法分析器主要依赖LR1类,通过内部的project_family保存项目集族,links等数据结构共同使用进行项目集族的跳转。
关于dict字典,引用了defaultdict类带替代部分字典类,优势在于如果键值不存在不会引发keyerror。
class LR1:
数据结构名 |
类型 |
介绍 |
symbol |
列表 |
保存除了’#’以外的所有终结符。 |
project_family_num |
int |
保存总共的项目集族数。 |
project_num |
int |
保存总共的项目数。 |
next_states |
defaultdict |
[id][进位符号]=下一个项目集族。 |
projects |
defaultdict |
记录所有项目及编号,例如projects[S'][·S] = 1。 |
links |
defaultdict |
用于项目集族的转换连接,例如: links[当前项目集族编号][下一个项目集族编号] = 转换需要的进位符。 |
first |
defaultdict |
保存所有非终结符的first集。 |
search |
defaultdict |
保存前向搜索符。 |
project_index |
字典 |
根据编号查找项目,例如:project_index[1] = (S', ·S) 。 |
project_family |
字典 |
表示项目集族。 |
production |
列表 |
表示产生式,从1开始保存方便后续使用。 |
production_index |
defaultdict |
通过编号来索引产生式。 states: 集合类,保存项目集族编号。 |
states |
集合 |
保存项目集族编号。 |
start_state |
int |
表示起点的项目集族编号。 |
详细设计:
构造项目集族的方法:
函数名 |
返回值 |
方法介绍 |
go_LR1(alphabet, list_source) |
LR1对象。 |
list_source表示所有的产生式,以二维列表格式传入,该方法读取二型文法并添加项目,添加first集,返回包含整个DFA的LR1对象。 |
go_dfa(lr1) |
没有返回值。 |
该方法在go_LR1内部,目的是形成DFA,内容保存在LR1对象中。 |
get_first_ahead(self, big_sign) |
返回终结符。 |
该方法扫描计算big_sign的first集,保存到first中。 |
add_search(self, state_num, project, sign) |
没有返回值。 |
将sign添加到state_num下项目project的前向搜索符中。 |
add_first(self, big_sign, sign) |
没有返回值。 |
将sign添加到big_sign的first集中。 |
get_first(self, big_sign) |
返回first集内容。 |
用于构造过程中需要first集时的寻找,如果有新增则会调用上面方法添加到first集。 |
get_project_family(self, project_family, state_num) |
返回项目集族。 |
遍历项目得到·S这类指向非终结符的项目来寻找S开头且·在最开始的项目,得到一个完整的项目集族。 |
be_the_only(self, project_family) |
返回项目集族。 |
去重复,合并只有搜索符不同其他相同的项目。 |
get_closure_search(self, left, state_num, sign) |
返回项目集族。 |
用于补全项目集族。 |
get_closure(self, big_sign) |
返回项目集族。 |
用于补全项目集族,上下方法略有不同。 |
get_tmp_family(self, tmp_family) |
返回项目集族。 |
得到类似上面的get_project_family,得到tmp的闭包从而得到完整的项目集族。 |
link(self, sta, next_sta, carry) |
没有返回值。 |
进行项目集族之间的连接。 |
get_next_sta(self, sta, carry) |
返回项目编号以及是否建立新状态的布尔值。 |
carry表示进位的符,如果存在下一个项目集族的编号就返回编号,否则新建一个项目集族。 |
add_project_family(self, next_sta, tmp_family) |
没有返回值。 |
将项目添加到项目集族中,从temporary转正到正式的项目集族。 |
extend(list_source) |
返回拓广文法之后的产生式。 |
拓广文法。 |
构造action、goto表的方法:
函数名 |
返回值 |
方法介绍 |
go_LR1_table(lr1) |
成功则返回action, goto, True。失败返回三个False。 |
形成action、goto表,返回action、goto表以及一个布尔值表示是否成功,如果创建失败返回三个False,用最后一个布尔值来判断是否要进行语法分析。 |
add_action(sta, sign, state, action) |
没有返回值。 |
将转换添加到action表中。 |
go_jump(lr1, sta, sign) |
指定的下一个项目集族编号。 |
用于项目集族的编号跳转。 |
add_goto(sta, carry, go, goto) |
没有返回值。 |
将转换添加到goto表中。 |
语法分析的方法:
函数名 |
返回值 |
方法介绍 |
get_code() |
两个列表,一个储存扫描的词,一个对照词储存行数 |
用于读取上一个任务得到的经过扫描的token表,并记录行数,方便语法分析的处理。 |
analyse(action, goto, lr1) |
返回类型不固定:
|
语法分析的核心函数,将上述方法得到的token处理后依据前面得到的action、goto表进行语法分析,出错可以大致写出错误信息。 |
read(action, goto, lr1) |
没有返回值。 |
语法分析的总函数,在这里调用analyse,成功输出”YES”,反之输出”NO”以及错误信息。 |
main函数流程:
测试与运行:
首先获取任务一的token,如图:
运行程序,得到结果:
修改token,在末尾多加几行:
运行程序得到结果:
这里的错误行信息表示第九行的限定符后面不可以接第十行的限定符。
现在进行删除测试,如图:
运行结果:
运行完成。
编译原理课程设计:语法分析器相关推荐
- 编译原理公式计算器C语言,编译原理课程设计-简单计算器实现.doc
编译原理课程设计-简单计算器实现 课程设计报告课程:编译原理学号:姓名:班级:11级嵌入式应用技术班教师:时间:2014年6月计算机科学与技术系 设计名称:简单计算器的实现设计内容.目的与要求:设计内 ...
- c语言实现编译器编译原理,编译原理课程设计--C语言编译器实现.doc
编译原理课程设计--C语言编译器实现 甘肃政法学院 编译原理课程设计 题 目 C语言编译器实现 计算机科学学院计算机科学与技术专业10 级 计本 班 学 号: 201081010137 姓 名: 杨青 ...
- 基于c语言的编译原理课程设计,编译原理课程设计心得体会
与<编译原理课程设计心得体会>相关的范文 本文由leishensc贡献 doc文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机查看. 2008-2009 学年第二学 ...
- 编译原理实验-LL1语法分析器(自动生成First集、Follow集求法)java实现
编译原理实验-LL1语法分析器(自动生成First.Follow)java 博主在做实验时,参考众多他人代码,发现bug众多,在@moni_mm代码基础上,与伙伴把能看到的BUG都做出修正,同时增添了 ...
- 广西大学编译原理课程设计
github地址:github地址 Curriculum-design-of-Compilers-Principles 简要介绍:这是由广西大学计算机科学与技术系的三位同学编写的编译原理课程设计.使用 ...
- 编译原理课程设计词法分析
编译原理课程设计词法分析任务书 5)参考文献: (1)张素琴,吕映芝. 编译原理[M]., 清华大学出版社 (2)蒋立源.康慕宁等,编译原理(第2版)[M],西安:西北工业大学出版社 6)课程设计 ...
- 对计算机课程设计的认识,编译原理课程设计心得体会范文
经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计.通过该课程设计,收获颇多. 一.对实验原理有更深的理解 通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶 ...
- 课程设计是计算机科学与技术专业的一门,计算机107编译原理课程设计.doc
淮阴工学院 编译原理课程设计指导书 王文豪 江苏·淮阴工学院·计算机工程系 二OO九年三月 前言 <编译原理>是计算机科学与技术专业最重要的一门专业基础课程,内容庞大,涉及面广,知识点多. ...
- 编译原理课程设计-C语言子集编译器(Java实现)
编译原理课程设计-一个C语言子集编译器 项目地址 https://github.com/qiushuang139/c-compliers 联系方式: email:qiushuang820@outloo ...
最新文章
- 多层陶瓷电容器用处_陶瓷电容的作用及特点
- 为什么C语言exe能直接打开,怎么让c语言生成的exe双击就能运行呢?
- CF1458C Latin Square
- Item 13 Minimize the accessibility of classes and members
- Android之仿ele地图定位效果
- 【温度检测】基于matlab GUI热红外图像温度检测系统【含Matlab源码 1920期】
- httpCient 的getResponseBodyAsStream instead is recommended使用方法
- plsql报错:Not logged on
- [渝粤题库]西北工业大学中国古代法制史
- python 操作word页眉表格_Python-docx读写Word文档(插入图片、表格,设置表格样式,章节,页眉页脚)...
- 产品概念之3/4:五层次理论 —— 消费者体验视角的产品概念
- unity2D横版游戏教程10-场景控制
- 【题】【贪心】NKOJ3827 火车运输
- X2C 电商 设计思路
- 魂行道 之 湖滨鬼舍
- c语言课程设计找出肇事车牌,C语言课程设计报告.doc
- 《第一行代码》第三版笔记
- 利用image J测定叶表面积
- java.lang.IllegalArgumentException: Can not set int field *** to null value
- 哈希(Hash)查找算法详解之C语言版
热门文章
- win 10电源正在计算机,win10系统提示当前没有可用的电源选项解决办法
- 什么是cookie?什么是session?session和cookie有什么区别?
- IDEA默认设置修改 快捷键
- [opencv] 练习题实现 使用轨迹栏创建颜色和画笔半径可调的Paint应用程序。有关绘制的信息,请参阅有关鼠标处理的先前教程。
- 军训计算机电气专业解说词,军训方队解说词.doc
- 【LDA】LDA主题模型笔记—主要是狄利克雷
- HTML爱心网页制作[樱花+爱心+炫彩文字]
- arduino平衡小车教程
- 玩转Linux与运维岗(37)
- python string indices must be_Python解析json时提示“string indices must be integers”问题解决方法...