欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    编译基础学习知识原理实验词法语法分析附源代码.docx

    • 资源ID:24215707       资源大小:71.81KB        全文页数:25页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译基础学习知识原理实验词法语法分析附源代码.docx

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

    2、D(,) := 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)(ti

    3、mes, * )(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)文法。程序在处理词法分析的过程就

    4、是不断通过getsym()这个函数来条用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)文法则判定为错误,若符合则继续向下完成语法分析。【源代码】

    7、#include #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,

    8、 beginsym, 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 id

    9、al+1;/ 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;

    10、 ssym(=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(&symwor

    11、keql0,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); strc

    12、py(&word70,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; ws

    13、ym11=whilesym; 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

    14、; case 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;

    15、 cout( 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

    16、; cout( 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 ,

    17、 ID )endl;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

    18、; case 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 reads

    19、ym:fout ( 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:f

    20、out ( 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); i


    注意事项

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

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开