欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年编译原理实验—词法分析 .pdf

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

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

    2022年编译原理实验—词法分析 .pdf

    实验一词法分析有如下算术运算文法:1)E-E+T 2)E-E-T 3)E-T 4)T-T*F 5)T-T/F 6)T-F 7)F-(E)8)F-I 9)I-十进制实数|十进制整数|十六进制实数|十六进制整数|八进制实数|八进制整数10)十进制实数-(0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*).(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*11)八进制实数-0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*.(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*12)十六进制实数-0 x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*.(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*13)十进制整数-名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 10 页 -0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*14)八进制整数-0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)*15)十六进制整数-0 x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*单词分类:运算符:+-*/()常数:十进制实数十进制整数十六进制实数十六进制整数八进制实数八进制整数1.实验目的实现一个词法分析程序,将输入字符串流分解成单词流供语法分析使用。2.实验要求输入算术运算式,输出分解后的单词流,例如:输入(0124.3+0 x35a.4f)*12输出:名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 10 页 -运算符(八进制实数0124.3 运算符+十六进制实数0 x35a.4f 运算符)运算符*十进制整数12 注意:输入可以是键盘输入,也可以是文件输入如果单词输入错误,必须有提示,例如:输入 12a+45*013468-0 x23a3 输出错误数据 12a 运算符+十进制整数45 运算符*错误数据0123468 运算符-十六进制整数0 x23a3/如(0124.3+0 x35a.4f)*12/如a+45*013468-0 x23a3 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 10 页 -#include#include/#include stdafx.h union chars /联合,可存储字符串,整型和浮点型char pro_char15;int pro_number;float real;struct data /将每个单元用一个结构来存储,其内容包括:类型,所属的具体类型,以及属性值char kind7;int id;union chars pro;int scan(char *a);/对每个用空格打断的单元进行进一步的分析,对其进行进一步的分类void Prints(char a15,int id,int a_long);/将分析后的每个token 输出void save(char *a,int id,int x);/将分析后的结果保存到一个结构数组中char nowChar15;/临时的存储单元,用来存储被空格打断以后单元char kinds118=,INT10,INT8,INT16,IDN,REAL10,REAL8,REAL16;/单词的不同种别struct data link100;/用来存放词法分析以后的结果的结构数组int link_long=0;/全局变量int scan(char *a)/int id;int a_long=0;int doc=0;while(*a!=NULL)nowChar0=0;a_long=0;doc=0;/对数值的判断及处理if(0=*a&*a=9)/如果第一个字符为数值nowChara_long=*a;*a+;a_long+;/对十六进制的判断及处理if(nowChar0=0&(*a=x|*a=X)/如果第一个字符为0,且第二个字符为x,则为十六进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=9)|(a=*a&*a=f)|(A=*a&*a=F)|*a=.)nowChara_long=*a;/一直将此十六进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 10 页 -*a+;a_long+;nowChara_long=0;/判断输入的十六进制数是否合法if(a_long=2)/输入的只有 x,则输入错误Prints(nowChar,7,a_long);return 0;if(doc)/输入的十六进制数是浮点型的Prints(nowChar,10,a_long);/则将其具体的类型属性定为else/输入的十六进制数是整型的Prints(nowChar,3,a_long);/则将其具体的类型属性定义为continue;/对八进制的判断及处理if(nowChar0=0&0=*a&*a=7)/如果第一个字符为0,且第二个字符,07,则为八进制数nowChara_long=*a;*a+;a_long+;while(*a!=NULL&(0=*a&*a=7)|*a=.)nowChara_long=*a;/一直将此八进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0;if(doc)/输入的八进制数是浮点型的Prints(nowChar,9,a_long);/则将其具体的类型属性定为else/输入的十六进制数是整型的Prints(nowChar,2,a_long);/则将其具体的类型属性定义为continue;/对十进制数的判断及处理else while(*a!=NULL&(0=*a&*a=9)|*a=.)nowChara_long=*a;/一直将此十进制数完全读入,若为浮点型的,则加以标记if(*a=.)doc=1;*a+;a_long+;nowChara_long=0;名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 10 页 -if(doc)/输入的十进制数是浮点型的Prints(nowChar,8,a_long);/则将其具体的类型属性定为else/输入的十进制数是整型的Prints(nowChar,1,a_long);/则将其具体的类型属性定义为continue;/完成了对数值的判断及处理 /对字符的判断及处理else nowChara_long=*a;*a+;a_long+;/判断输入的字符是否为运算符或其他的分隔符switch(nowChar0)case+:case-:case*:case/:case:case(:case):case=:case;:nowChara_long=0;Prints(nowChar,5,a_long);/将其具体的类型属性定义为continue;default:break;/判断输入的第一个字符是否为字母if(a=nowChar0&nowChar0=z)|(A=nowChar0&nowChar0=Z)while(*a!=NULL&(a=*a&*a=z)|(A=*a&*a=Z)|(0=*a&*a=9)|(*a=.)|(*a=_)/一直将此字符串完全读入 nowChara_long=*a;*a+;a_long+;nowChara_long=0;/判断输入的字符串是否为特殊的标识符,若是,则将其具体类型值定义为/判断输入的字符串是否为特殊的字符串if if(a_long=2&strcmp(nowChar,if)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串then if(a_long=4&strcmp(nowChar,then)=0)Prints(nowChar,6,a_long);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 10 页 -continue;/判断输入的字符串是否为特殊的字符串else if(a_long=4&strcmp(nowChar,else)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串while if(a_long=5&strcmp(nowChar,while)=0)Prints(nowChar,6,a_long);continue;/判断输入的字符串是否为特殊的字符串do if(a_long=2&strcmp(nowChar,do)=0)Prints(nowChar,6,a_long);continue;/若输入的字符串不符合以上几种情况,则输入的为变量/若输入的字符串为变量,则将其具体属性值定义为Prints(nowChar,4,a_long);continue;/如果输入的既不是数值也不是字符串,则输入错误,将其具体类型之定义为else Prints(nowChar,7,a_long);return 0;return 1;main()char buf100;/用来存储 从键盘上输入 一串字符char *tokenPtr;/用来存储用空格打断后的单元int id=1;/用来存储具体的类型号 link_long=0;while(id)link_long=0;gets(buf);/从键盘上输入一串字符tokenPtr=strtok(buf,);/用空格将字符串打断while(id&*tokenPtr!=NULL)/分割出来的单元不为空 id=scan(tokenPtr);/将此单元进行继续分析,并返回其具体的类型值 tokenPtr=strtok(NULL,);/将字符串继续用空格进行分割 printf(nn);getchar();return 0;/将所分解后的单元存入结构数组中void save(char *a,int id,int x,float y)int i;if(link_long=5)if(id=8)/id=8,9,10 /若为浮点型的数值,则将浮点型的y值(转换后的)存入其属性当中且存入单词的种别for(i=0;i9&kindsidi!=0;i+)linklink_long.kindi=kindsidi;linklink_long.pro.real=y;/id=5,6,7 else /若为标识符,则将单词种别定为自身,属性值定为空for(i=0;i15&ai!=0;i+)linklink_long.kindi=ai;linklink_long.pro.pro_char0=-;linklink_long.pro.pro_char1=0;link_long+;/id=1,2,3,4 else for(i=0;i8&kindsidi!=0;i+)linklink_long.kindi=kindsidi;/若分解后的 token 为变量或者整型数值,则将其单词种别直接输出if(id=4)/若token 为变量,则将其属性值设为自身for(i=0;i15&ai!=0;i+)linklink_long.pro.pro_chari=ai;linklink_long.pro.pro_chari=0;else/若token 为整型数值,则将其相应的十进制数值赋给其属性值linklink_long.pro.pro_number=x;link_long+;/继续存入下一个token elseprintf(Full 100n);/结构数组已经存满return;/将词法分析器分解后的结果输出出来void Prints(char a15,int id,int a_long)int i;int x=0;float y=0;/int float1;/char*c;if(id=1)/若为十进制整数for(i=1;ia_long&ai!=0;i+)x=x*10+(ai-48);printf(INT10t%sn,a);save(a,id,x,y);/存入结构数组return;名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 10 页 -if(id=2)/若为八进制整数for(i=1;ia_long&ai!=0;i+)x=x*8+(ai-48);/换算为十进制数 printf(INT8t%dn,x);save(a,id,x,y);/存入结构数组return;if(id=3)/若为十六进制整数for(i=2;ia_long&ai!=0;i+)if(0=ai&ai9)x=x*16+(ai-48);/换算为十进制数else if(a=ai&ai=f)x=x*16+(ai-87);elsex=x*16+(ai-55);printf(INT16t%dn,x);save(a,id,x,y);/存入结构数组return;if(id=4)/若为变量printf(IDNt%sn,a);save(a,id,x,y);/存入结构数组return;if(id=5|id=6)/若为标识符(+,-,*,/,+以及if,else,while,then,do)printf(%st-n,a);save(a,id,x,y);/存入结构数组return;if(id=8)/若为十进制浮点型for(i=0;i=0&ai!=.;i-)y=(y+(ai-48)/10;y=y+x;/整数部分与小数部分换算后相加printf(REAL10t%fn,y);save(a,id,x,y);/存入结构数组return;if(id=9)/若为八进制浮点型名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 10 页 -for(i=1;i=0&ai!=.;i-)y=(y+(ai-48)/8;y=y+x;/整数部分与小数部分换算后相加printf(REAL8t%fn,y);save(a,id,x,y);/存入结构数组return;if(id=10)/若为十六进制浮点型for(i=2;i=0&ai!=.;i-)y=(y+(ai-48)/16;y=y+x;/整数部分与小数部分换算后相加printf(REAL16t%fn,y);/存入结构数组save(a,id,x,y);return;printf(Wrong Enter);/所得的具体类型值为,则输入有错误return;名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 10 页 -

    注意事项

    本文(2022年编译原理实验—词法分析 .pdf)为本站会员(H****o)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开