编译原理实验1词法分析器构造.pdf

编译原理实验1词法分析器构造.pdf

ID:56485174

大小:665.87 KB

页数:7页

时间:2020-06-24

编译原理实验1词法分析器构造.pdf_第1页
编译原理实验1词法分析器构造.pdf_第2页
编译原理实验1词法分析器构造.pdf_第3页
编译原理实验1词法分析器构造.pdf_第4页
编译原理实验1词法分析器构造.pdf_第5页
资源描述:

《编译原理实验1词法分析器构造.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、序号:2018~2019年春季学期《编译原理》课程实验报告实验一词法分析器构造专业班级:学生姓名:学生学号:一、实验目的和要求通过对给定源语言词法分析程序的设计,加深对词法分析原理的理解,掌握源语言的接收、存贮、预处理和扫描分析,生成正确的单词符号串二元式序列。二、实验内容编程实现下述C语言子集的词法分析程序,C语言子集的文法描述如下:语句→赋值语句|条件语句|转移语句|带标号的赋值语句带标号的赋值语句→〈标号〉〈赋值语句〉赋值语句→变量=算术表达式条件语句→IF<布尔表达式>THEN语句|IF<布尔表达式>THEN语句ELSE语句转移语句→

2、GOTO标号变量→标识符标识符→字母|<标识符><数字>字母→A|B|…|Z|a|b|…|z数字→0|1|…|9算术表达式→项|算术表达式+项|算术表达式-项项→因子|项*因子|项/因子|因子↑项因子→变量|常数|(表达式)布尔表达式→<算术表达式><关系符><算术表达式>关系符→>|<|>=|<=|=|<>标号→常数常数→数字|<常数><数字>对语言的几点限制:关键字不允许作为标识符使用。关键字、标识符、常数、标号之间若没有确定的运算符或界符,则必须用空格符隔开。源程序书写按C标准格式。续行最多不得超过5行。三、实验的实现1.主要设计思想大

3、体分为三个步骤:(1)预处理用正则表达式去掉源文件中的注释,将’’换行内容整理为一行,用split()进行分割,使源文件变成一个一个的表达式。(2)识别对每一个表达式用正则表达式将表达式以符号分割,对分割出的每一项进行类型判断,打印结果并返回该表达式中的所有项的二元式组成的列表(3)保存将之前的二元式列表合并后保存到文件中。2.实现算法及程序流程图开始预处理识别保存结束3.主要技术问题的处理方法(1)开始时只能用正则表达式匹配单行注释,无法识别/**/之间有换行符的情况。查资料后,在编译表达式模板时,可使用re.DOTALL,如此即可识别换

4、行符。(2)Split()函数认识不清,最初代码中还有一步是将换行符替换为空格,然后再用split(),后来发现split()函数可以直接分割空白字符包括换行符,制表符和空格等(3)提取标号时也遇到困难,经研究可以直接用正则表达式d:的形式识别数字冒号连在一起的形式,直接将标号识别出来了。4.程序代码:实验实现的源程序,要求符合一般的程序书写风格,并包括必要的注释。importre#K:关键字I:标识符C:常数O:运算符P:界符L:标号KEYWORD=['IF','THEN','ELSE','GOTO']OP=['+','-','*',

5、'/','>','<','=','>=','<=','<>']INTERPUNCTION=[',',':','(',')']#预处理#1.用正则表达式去掉源文件中的注释,#2.将’’换行内容整理为一行#3.用split()进行分割,生成表达式列表#4.返回分割结果defpre_process(text):cmt_regex=r'(/*.+?*/

6、//.+?)'cmt_pattern=re.compile(cmt_regex,re.DOTALL)comments=cmt_pattern.findall(text)forcmtincom

7、ments:text=text.replace(cmt,'')text=text.replace('\','')formulas=text.split()returnformulas#处理#将传入的表达式列表元素依次识别,存入二元式列表defprocess(formulas):binarys=[]forformulainformulas:binarys.extend(identify(formula))returnbinarys#识别#将传入的表达式进行识别#1.用正则表达式将表达式以符号分割#2.对分割出的每一项进行类型判断#3.打印

8、结果并返回该表达式中的所有项的二元式组成的列表defidentify(str):splt_regex=r'(>=

9、<=

10、<>

11、d+?:

12、[><=:()+*-/])'splt_pattern=re.compile(splt_regex)sections=splt_pattern.split(str)binarys=[]print(""+str)forsectioninsections:binary=''ifnotsection:continueifsectioninKEYWORD:binary='(K,'+section+')'p

13、rint('关键字:(K,%4s)'%section)elifsectioninOP:binary='(O,'+section+')'print('运算符:(O

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。