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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理实验词法语法分析附源代码.docx

1、编译原理实验词法语法分析附源代码编译原理实验报告*PL0语言功能简单、结构清晰、可读性强,而又具备了一般高级程序设计语言的必须部分,因而PL0语言的编译程序能充分体现一个高级语言编译程序实现的基本方法和技术。PL/0语言文法的EBNF表示如下::=. := :=CONST,; := := :=VAR , ; :=| :=; ; :=PROCEDURE ; :=| | :=:= :=BEGIN ; END := |ODD := +|- := := | () := +|- := *|/ := =|#|= := IF THEN := CALL 标识符 := WHILE DO := READ(,) :

2、= WRITE(,) := a|b|X|Y|Z := 0|1|8|9【预处理】对于一个pl0文法首先应该进行一定的预处理,提取左公因式,消除左递归(直接或间接),接着就可以根据所得的文法进行编写代码。【实验一】词法分析【实验目的】给出PL/0文法规范,要求编写PL/0语言的词法分析程序。【实验内容】已给PL/0语言文法,输出单词(关键字、专用符号以及其它标记)。【实验要求】1.确定编译中使用的表格、标识符与关键字的区分方法等。2.把词法分析器设计成一个独立一遍的过程。3.词法分析器的输出形式采用二元式序列,例如:(ident, a)(plus, + )(number, 15)(times, *

3、 )(ident, b )【输入输出】输入:PL/0源程序。例: a+15*b输出:(ident, a)(plus, + )(number, 15)(times, * )(ident, b )【实验结果】实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,到达句柄时,则采取LL(1)文法进行规约。实验结果如下: 实验结果用文本来进行输入输出,所以在工程目录下还会有一个文本输入,输出文件。分别为in.txt out.txt【实验体会】在编写这段代码的过程中,比较麻烦得还是之前的语法预处理阶段,将不满足ll(1)文法的语法转化为标准的ll(1)文法。程序在处理词法分析的过程就是不断通过g

4、etsym()这个函数来条用getch(),不断形成一个一个的词汇,供下面语法分析时使用。记录词汇类型的sym是一个枚举类型。使用起来会方便许多,比较系统。其中还用到了文本输入输出的技巧,把读出的词汇保存起来。词法分析还是比较简单,在编写代码的时候没有太大的阻碍。通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C+语言)直接编写此法分析程序。另外,也让我重新熟悉了C+语言的相关内容,加深了对C+语言的用途的理解。【实验二】语法分析【实验目的】给出PL/0文法规范,要求编写PL/0语言的语法分析

5、程序。【实验内容】已给PL/0语言文法,构造表达式部分的语法分析器。【实验要求】1.将实验一“词法分析”的输出结果,作为表达式语法分析器的输入,进行语法解析,对于语法正确的表达式,报告“语法正确”;对于语法错误的表达式,报告“语法错误”, 指出错误原因。2.把语法分析器设计成一个独立一遍的过程。3.语法分析器的编写方法采用递归子程序法。【输入输出】输入:PL/0表达式,用实验一的输出形式作为输入。例如: 对于PL/0表达式,a+15*b用下列形式作为输入:(ident, a)(plus, + )(number, 15) (times, * )(ident, b )输出:对于语法正确的表达式,报

6、告“语法正确”;对于语法错误的表达式,报告“语法错误”, 指出错误原因。【实验结果】实验结果与实验要求相同,没有异议,对输入字符采取一个一个读入,对输入的一个语句进行判断,判断语法的正误,采用对算法的判断,若全为数字则进行最后的计算【实验体会】通过语法分析可以判断当前输入语句是否正确,实验通过对数学式的处理来进行对语句的判断是否正确,若正确则只要输入“语句正确”即可,若语句错误则需要根据错误的原因输出错误的理由,以方便编译员修改自己的代码。实现方法是通过对文本文件的输入,当前数据与即将输入的字符串进行匹配,若不符合LL(1)文法则判定为错误,若符合则继续向下完成语法分析。【源代码】#inclu

7、de #include #include #include #include #include #include #include using namespace std;ifstream fin(in.txt);ofstream fout(out.txt);enum symbol /0 1 2 3 4 5 6 7 nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, begin

8、sym, endsym, ifsym, thensym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym;#define symnum 32char symworksymnum10;/单符号#define norw 13 /key_word num#define al 10 /maxstr#define nmax 10/number longchar wordnorwal;/key wordchar ch;/bufferchar getch()enum symbol sym;char idal+1;/

9、 identchar aal+1;/tempchar IDal+1; int cc=0,ll=0,num;/当前在行的位置cc,行字符的长度ll,num数字的值int nn=0;char line81;int flg=0;/ 正数;/char line81;enum symbol ssym256;enum symbol wsymnorw;/int cc,ll;/chccint err;void init() int i; for(i=0;i=255;i+) ssymi=nul;/0 ssym+=plus; ssym-=minus; ssym*=times; ssym/=slash; ssym(

10、=lparen; ssym)=rparen; ssym=eql; ssym,=comma; ssym.=period; ssym#=neq;/not equal ssym;=semicolon; strcpy(&symworkplus0,plus); strcpy(&symworkminus0,minus); strcpy(&symworktimes0,times); strcpy(&symworkslash0,slash); strcpy(&symworklparen0,lparen); strcpy(&symworkrparen0,rparen); strcpy(&symworkeql0,

11、eql); strcpy(&symworkcomma0,comma); strcpy(&symworkneq0,neq); strcpy(&symworkperiod0,period); strcpy(&symworksemicolon0,semicolon); strcpy(&word00,begin);/关键字小写字母 strcpy(&word10,call); strcpy(&word20,const); strcpy(&word30,do); strcpy(&word40,end); strcpy(&word50,if); strcpy(&word60,odd); strcpy(&wo

12、rd70,procedure); strcpy(&word80,read); strcpy(&word90,then); strcpy(&word100,var); strcpy(&word110,while); strcpy(&word120,write); wsym0=beginsym; wsym1=callsym; wsym2=constsym; wsym3=dosym; wsym4=endsym; wsym5=ifsym; wsym6=oddsym; wsym7=procsym; wsym8=readsym; wsym9=thensym; wsym10=varsym; wsym11=w

13、hilesym; wsym12=writesym;void WordAnalyse() switch(sym) case nul:/fout ( nul , ID )endl; break; case ident:fout ( ident , ID )endl; cout( ident , ID )endl;break; case number:fout ( number , num )endl; cout( number , num )endl;break; case plus:fout ( plus , ID )endl; cout( plus , ID )endl;break; case

14、 minus:fout ( minus , ID )endl; cout( minus , ID )endl;break; case times:fout ( times , ID )endl; cout( times , ID )endl;break; case slash:fout ( slash , ID )endl; cout( slash , ID )endl;break; case oddsym:fout ( oddsym , ID )endl; cout( oddsym , ID )endl;break; case lss:fout ( lss , ID )endl; cout(

15、 lsst , ID )endl;break; case eql:fout ( eql , ID )endl; cout( eql , ID )endl;break; case neq:fout ( neq , ID )endl; cout( neq , ID )endl;break; case leq:fout ( leq , ID )endl; cout( leq , ID )endl;break; case gtr:fout ( gtr , ID )endl; cout( gtr , ID )endl;break; case geq:fout ( geq , ID )endl; cout

16、( geqt , ID )endl;break; case lparen:fout ( lparent , ID )endl; cout( lparent , ID )endl;break; case rparen:fout ( rparent , ID )endl; cout( rparent , ID )endl;break; case comma:fout ( comma , ID )endl; cout( comma , ID )endl;break; case semicolon:fout ( semicolon , ID )endl; cout( semicolon , ID )e

17、ndl;break; case period:fout ( period , ID )endl; cout( period , ID )endl;break; case becomes:fout ( becomes , ID )endl; cout( becomes , ID )endl;break; case beginsym:fout ( beginsym , ID )endl; cout( beginsym , ID )endl;break; case endsym:fout ( endsym , ID )endl; cout( endsym , ID )endl;break; case

18、 ifsym:fout ( ifsym , ID )endl; cout( ifsym , ID )endl;break; case thensym:fout ( thensym , ID )endl; cout( thensym , ID )endl;break; case whilesym:fout ( whilesym , ID )endl; cout( whilesym , ID )endl;break; case writesym:fout ( writesym , ID )endl; cout( writesym , ID )endl;break; case readsym:fou

19、t ( readsym , ID )endl; cout( readsym , ID )endl;break; case dosym:fout ( dosym , ID )endl; cout( dosym , ID )endl;break; case callsym:fout ( callsym , ID )endl; cout( callsym , ID )endl;break; case constsym:fout ( constsym , ID )endl; cout( constsym , ID )endl;strcpy(ID,);break; case varsym:fout (

20、varsym , ID )endl; cout( varsym , ID )endl;break; case procsym:fout ( procsym , ID )endl; cout( procsym , ID )endl;break; default :break; int getch() if(cc=ll) if(fin.eof() coutprogram incpmplete!endl; return -1; ll=cc=0; fin.getline(line,81); ll=strlen(line); ch= ; return 0; if(cc=0) cout lineendl; ch=linecc; coutch=a&ch=a&ch=0&ch=9) /名字或保留字以a.z 开头 if(kal) IDk=ch; k+; getchdo; IDk=0; i=0; j=norw; do /* 搜索当前符号是否为保留字 */ k=(i+j)/2; if(strcmp(ID,wordk)=0)i=k+1; while(ij)sym=wsymk; else sym=ident; /* 搜索失败,则是名字或数字 */ else if(ch=0&ch=0&ch=9); if(flg=

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

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