ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:170.82KB ,
资源ID:12312577      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12312577.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理报告 8.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

编译原理报告 8.docx

1、编译原理报告 8 课 程 设 计 报 告题目: 设计词法语法分析器 课程名称: 编译原理上机实验 专业班级: 信息安全 1302 班 学 号: 姓 名: 指导教师: 报告日期: 2015年11月2日 计算机科学与技术学院1.词法分析1.1实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。1.2 实验要求 1.待分析的简单语言的词法 (1)关键字: begin if then while do end 所有的关键字都是小写 (2)运算符和界符:= + - * / = = = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=let

2、ter(letter|digit)* NUM=digit digit* (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2 各种单词符号对应的种别码单词符号种别码单词符号种别码begin121if222then3,23while4:24Do5:=25End6;26letter(letter|digit)*1027digit digit*11=28+1329-1430*150 then x:=2*x+1/3; end#的源文件,经词法分析后输出如下序列:(1, begin)(10,x)(25,:=)(11,9)(26,;)(2,

3、if)1.3 词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字种类,拼出相应的单词符号。1. 主程序示意图主程序示意图如图1.1所示。其中初值包括如下两个方面。 图1.1(1) 关键字表的初值。 char *rwtab6=“begin”,”if”,”then”,”while”,”do”,”end”; 关键字是一种特殊的标识符,每一个关键字都应该有一个与其对应的编号,否则在后续的操作中将无法再进行下去。(2) 程序中需要用到的主要变量声明有如下几个:typedef struct int typenum; char

4、 * word;WORD;char input255;char token255=;int p_input;int p_token;char ch;2. 扫描子程序的算法思想首先设置3个变量:token用来存放构成单词符号的字符串或者是整形单词;input用于存储输入的程序;p_input,p_token分别用于记录当前两数组所用到的位置;结构类型WORD包含两个变量,其中typenum用于记录数据标号(相当于syn),word用于记录当前的数据。扫描子程序主要部分流程如图C.2所示。图C.21.4 词法分析程序的C语言实现1.4.1代码实现*head.h*#include#include#i

5、nclude#define _KEY_WORD_END waiting for your expandingtypedef struct int typenum; char * word;WORD;char input255;char token255=;int p_input;int p_token;char ch;char * rwtab=begin,if,then,while,do,end,_KEY_WORD_END;*head.h*cifa.h*/*从输入缓冲区读一个字符到ch */ char m_getch() ch=inputp_input; p_input+; return ch

6、;/*去掉空白*/ void getbc() while(ch= |ch=10) ch=inputp_input; p_input+; /*拼接单词*/ void concat() tokenp_token=ch; p_token+; tokenp_token=0;/*判断是否为字母*/ int letter() if(ch=a&ch=A&ch=0&chtypenum=10; myword-word=; p_token=0; m_getch(); getbc(); if(letter() while(letter()|digit() concat(); m_getch(); retract()

7、; myword-typenum=reserve(); myword-word=token; return myword; else if(digit() while(digit() concat(); m_getch(); retract(); myword-typenum=11; myword-word=token; return myword; else switch(ch) case =: m_getch(); if(ch=) myword-typenum=39; myword-word=; return myword; retract(); myword-typenum=25; my

8、word-word=; return myword; break; case +: myword-typenum=13; myword-word=+; return myword; break; case -: myword-typenum=14; myword-word=-; return myword; break; case *: myword-typenum=15; myword-word=*; return myword; break; case /: myword-typenum=16; myword-word=/; return myword; break; case (: my

9、word-typenum=27; myword-word=(; return myword; break; case ): myword-typenum=28; myword-word=); return myword; break; case : myword-typenum=29; myword-word=; return myword; break; case : myword-typenum=30; myword-word=; return myword; break; case : myword-typenum=31; myword-word=; return myword; bre

10、ak; case : myword-typenum=32; myword-word=; return myword; break; case ,: myword-typenum=33; myword-word=,; return myword; break; case : m_getch(); if(ch=) myword-typenum=18; myword-word=:=; return myword; retract(); myword-typenum=17; myword-word=:; return myword; break; case ;: myword-typenum=26;

11、myword-word=; return myword; break; case : m_getch(); if(ch=) myword-typenum=24; myword-word=; return myword; retract(); myword-typenum=23; myword-word=; return myword; break; case typenum=22; myword-word=typenum=20; myword-word=typenum=40; myword-word=!=; return myword; retract(); myword-typenum=-1

12、; myword-word=ERROR; return myword; break; case # : m_getch(); myword-typenum=0; myword-word=#; return myword; break; case 0: myword-typenum=1000; myword-word=OVER; return myword; break; default: myword-typenum=-1; myword-word=ERROR; return myword; *cifa.h*main.cpp* #include head.h#include cifa.h#in

13、clude yufa2.h /语法部分的实现,后续给出利用C+实现的代码int main() int over=1; WORD* oneword=new WORD; printf(Enter Your words(end with #):n); scanf(%#s,input); p_input=0; do p_token=0; m_getch(); if(ch!=#) retract(); oneword=scaner(); if(oneword-typenum!=1000) if(oneword-typenum!=10) printf(%d,%s),oneword-typenum,onew

14、ord-word); else printf(%d,%s),oneword-typenum,oneword-word); while(oneword-typenum!=1000 & oneword-typenum!=-1); printf(nn); p_input=0; p_token=0; yufa yf(scaner(),0); yf.lrparser(); return 0;*main.cpp*1.4.2测试数据:说明:因为我的程序是直接把语法和词法一起调用了一下,所以出现了“语句错误”(无法识别if)。2.语法分析2.1实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序

15、列的语法检查和结构分析。2.2实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。1. 待分析的简单语言的语法用扩充的BNF表示如下:(1):=beginend(2):=;(3):=(4):=ID:=(5):=+|-(6):=*|/(7):=ID|NUM|()2.实验要求说明输入单词串,以“#“结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。例如: 输入 begin a:=9;x:=2*3;b:=a+x end # 输出 success 输入 x:=a+b*c end # 输出error2.3 语法分析程序的算法思想 (1)主程序示意图

16、如图2.1所示。 图2.1 (2)递归向下分析程序示意图如图2.2所示。 (3)语句串分析过程示意图如图2.3所示。 (4)statement语句分析函数流程如图2.4、图2.5、图2.6、图2.7所示。图2.3递归下降分析程序示意图图2.4 语句串分析示意图图2.5 statement语句分析函数示意图图2.6 expression表达式分析函数示意图图2.7 term分析函数示意图图2.8 factor分析过程示意图2.4 语法分析程序的C+语言实现2.4.1 代码实现*yufa2.h*class yufa friend WORD* scaner(); private : WORD *on

17、eword; int kk; public : yufa(WORD* x,int k) oneword=x; kk=k; void expression(); void factor(); void term(); void statement(); void yucu(); void lrparser();void yufa:factor() if(oneword-typenum=10|oneword-typenum=11) oneword=scaner(); else if(oneword-typenum=27) oneword=scaner(); expression(); if(one

18、word-typenum=28) oneword=scaner(); else printf()错误n); kk=1; else printf(表达式错误n); kk=1; return ;void yufa:term() factor(); while(oneword-typenum=15|oneword-typenum=16) oneword=scaner(); factor(); return ;void yufa:expression() term(); while(oneword-typenum=13|oneword-typenum=14) oneword=scaner(); ter

19、m(); return ;void yufa:statement() if(oneword-typenum=10) oneword=scaner(); if(oneword-typenum=18) oneword=scaner(); expression(); else printf(赋值号错误n); kk=1; else printf(语句错误n); kk=1; return ;void yufa:yucu() statement(); while(oneword-typenum=26) oneword=scaner(); statement(); return ;void yufa:lrp

20、arser() if(oneword-typenum=1) oneword=scaner(); yucu(); if(oneword-typenum=6) oneword=scaner(); if(oneword-typenum=1000&kk=0) printf(successn); else if(kk!=1) printf(缺endn); kk=1; else printf(begin错误n); kk=1; return ;*yufa2.h*2.4.2 实例检测说明:程序所识别的赋值号应该为:=而不是=所以报错说明:end 前面不能有分号,所以报错。 说明:语法正确。3实验心得通过本次实

21、验,我亲自动手实现了词法语法分析程序的设计,通过这次设计也使我对语法词法分析有了更加深刻的理解。总体来说,这两个小实验都还是比较简单的,基本上书上都有相应的流程图和大体的程序框架,只要了解了其基本的思想,写出来不算太难。在整个实验实现的过程中,我在语法分析程序上吃了一点小亏。因为一开始是直接看了书上的流程图,感觉没什么问题就按照书上的框架写了一份代码,然后考虑到流程图中都会有对数据的操作,于是便自己在每个函数里面都加了一个参数,结果硬是把自己给绕了进去,怎么调都不正确。后来仔细的又把流程一步步走了一遍,发现其实这几个函数中使用的数据并没有什么太大的相关性,每一个函数调用scaner的时候都可以直接用全局变量的形式来进行更改。想通了之后,为了便于变量的管理,我就把这几个函数加上一个变量用C+写成了一个类的形式进行了封装,这样程序看起来结构更清晰一些,也实现了相应的功能。本次实验让我学会了递归向下的词法分析过和,同时也让我学会了写程序要多动脑,先把问题想明白了再来写代码,不然的话,错误可就不是一般的多了

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1