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

    2022年语言词法分析器实验报告.doc

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

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

    2022年语言词法分析器实验报告.doc

    计算机科学与工程系编译原理课程设计实验报告姓名:_ *_ 学号_ *_ 年级专业及班级_08计算机科学与技术 成绩 实验名称词法分析程序设计与实现完成日期2011/4/12指导教师*实验目的:能够采用C编程语言实现简单的词法分析程序;设计、编制并调试一个词法分析程序,加深对词法分析原理的理解实验要求: 1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号; 3. 识别出的单词以<单词符号,种别码>的形式保存在符号表中(链表);4. 词法分析中源程序的输入以.c格式,分析后的符号表,将二元组保存在.txt文件中。实验内容:选择高级语言(C语言),编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程工具实验原理:1、算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号;2、其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 实验分析:(1)关键字:if else while do case int break等所有的关键字都是小写。(2)运算符和界符: = + - * / < <= <> > >= = ; ( ) 等(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = _ | letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 (5)注释被忽略(6)各种单词符号对应的种别码(如下):单词符号种别码单词符号种别码auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29while30static31if32a33b34f35n36t37v3839?4041”42043ddd44 xhh45数字46标识符47#48(49)505152535455*56:5758%5960+61?62=63|64&65!66<67>68>=69=70>>71!=72<<73&&74<=75|76+77?=78-79-80->81“82%A(A可为dsc)83;84_85/868788899091其他类别99实验流程图(由于流程图过大因此各部分分开写):整体:扫描注释:扫描数字:扫描引号:扫描单词:扫描其他字符:实验环境:需要TC、VC+ 6.0等开发工具作为本次试验的环境。实验步骤:1、准备: 用TC、VC+等开发工具;2、对本实验的任务进行分析,确定实现功能的函数;3、写好程序,仔细修改函数;4、上机操作:输入源程序,修改、调试,运行。5、写好试验报告。实验调试过程及测试结果/*源代码*/#include<stdio.h>#include<stdlib.h>#include <ctype.h> #include<string.h>void main()FILE *fp,*fp1;int hanjsq=1;/行计数器,保存行号int guanjz(char ch1);/关键字和标识符判断char ch,infile15,outfile15;/定义输入和输出文件名printf("*Enter the infile name*n");scanf("%s",infile);/输入需要扫描的文件名printf("*Enter the outfile name*n");scanf("%s",outfile);/输入需要另存为的文件名if(fp = fopen(infile,"r") = NULL)/打开需要扫描的文件printf("cannot open filen");exit(0);if(fp1 = fopen(outfile,"w") = NULL)/打开需要存入的文件printf("cannot open filen");exit(0);printf("n*n");printf("* 开始进行词法分析 *n");printf("*n");printf("n*n");printf("行号字符串种别码n");printf("*n");fprintf(fp1,"*n");fprintf(fp1,"行号字符串种别码n");fprintf(fp1,"*n");while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*扫描头文件单词及保留字*/if(isalpha(ch) | ch='_')/如果第一个字符为字母或下划线则判断为标识符int i=0;char ch130;/假定每个标识符最长为ch1i+=ch;/将ch保存到ch10中并使i自加1while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/如果ch为换行符,则行计数器自加1if(isalpha(ch) | isdigit(ch) | ch='_')/如果ch为字母、数字或下划线就把ch放到ch1i中并使i自加1ch1i+=ch;if(ch='.')/如果ch为小数点则判断是否为头文件 if(ch=fgetc(fp)='h')/如果小数点后一位为h则判定其为头文件if(ch=10)hanjsq+;ch1i+='.'ch1i+='h'ch1i='0'/把结束标志放到ch1i中作为单词结束标志printf("line %d:%s83n",hanjsq,ch1);/以字符串形式输出ch1fprintf(fp1,"line %d:%s83n",hanjsq,ch1);break;else/如果小数点后一位不是h则判定其为标识符fseek(fp,-1,1);/fp回退1ch1i='0'/把结束标志放到ch1i中作为单词结束标志printf("line %d:%s%dn",hanjsq,ch1,guanjz(ch1);/以字符串形式输出ch1fprintf(fp1,"line %d:%s%dn",hanjsq,ch1,guanjz(ch1);break;if(!isalpha(ch) && !isdigit(ch) && ch!='_' && ch!='.')/如果ch不为字母、数字、下划线和点时判断其为标识符ch1i='0'printf("line %d:%s%dn",hanjsq,ch1,guanjz(ch1);fprintf(fp1,"line %d:%s%dn",hanjsq,ch1,guanjz(ch1);break;/*扫描数字*/if(isdigit(ch) | ch='-')/如果ch为数字或'-'if(isdigit(ch)/如果ch为数字printf("line %d:%c",hanjsq,ch);fprintf(fp1,"line %d:%c",hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/预读一位如果ch为数字和点则循环输出if(isdigit(ch) | ch='.')printf("%c",ch);fprintf(fp1,"%c",ch);else/否则视为数字结束printf("46n");fprintf(fp1,"46n");fseek(fp,-1,1);/回退一位ch='0'/置ch为0,以免影响下面误判并顺利退出扫描数字break;if(ch='-')/如果ch为'-'ch=fgetc(fp);/预读一位if(ch='-')/如果ch还是为'-'则判断为自减符'-'printf("line %d:-80n",hanjsq);fprintf(fp1,"line %d:-80n",hanjsq);if(ch='>')/如果ch为'>',则判断为结构体运算符'->'printf("line %d:->81n",hanjsq);fprintf(fp1,"line %d:->81n",hanjsq);if(isdigit(ch)/如果ch为数字则可能为减号或负号fseek(fp,-3,1);/回退3为判断ch=fgetc(fp);if(isdigit(ch)/如果ch为数字则判断'-'为减号 ch=fgetc(fp);printf("line %d:%c79n",hanjsq,ch);fprintf(fp1,"line %d:%c79n",hanjsq,ch);else /否则判断'-'为负号ch=fgetc(fp);printf("line %d:%c",hanjsq,ch);fprintf(fp1,"line %d:%c",hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/预读一位如果ch为数字和点则循环输出if(isdigit(ch) | ch='.')printf("%c",ch);fprintf(fp1,"%c",ch);else/否则视为数字结束printf("46n");fprintf(fp1,"46n");fseek(fp,-1,1);/回退1break;/*扫描注释*/if(ch='/')/如果ch为'/'则可能为注释ch=fgetc(fp);/读下一个字符if(ch=10)hanjsq+;if(ch='/')/如果该字符也为'/'则判断为注释一行while(fgetc(fp)!=10);if(ch=10)hanjsq+;/直到遇到换行符出现才认为注释结束if(ch='*')/如果该字符为'*'则判断为注释多行/直到出现'*/'才认为注释结束while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;if(ch='*')/出现'*'/且接着出现'/'if(ch=fgetc(fp)='/')break;else/否则原样输出'/'printf("line %d:/83n",hanjsq);fprintf(fp1,"line %d:/83n",hanjsq);fseek(fp,-1,1);/回退1break;/*扫描引号*/if(ch='"')/出现引号int i=0;printf("line %d:%c82n",hanjsq,ch);fprintf(fp1,"line %d:%c82n",hanjsq,ch);printf("line %d:",hanjsq);fprintf(fp1,"line %d:",hanjsq);while(!feof(fp)/先整体输出引号内所有字符并定为第99类ch=fgetc(fp);i+;/用于积累回退长度if(ch=10)hanjsq+;if(ch!='"')if(ch!=32)printf("%c",ch);fprintf(fp1,"%c",ch);else break;printf("99n");fprintf(fp1,"99n");fseek(fp,-i,1);/回退到引号开始for(;i>0;i-)ch=fgetc(fp);if(ch=92)/如果ch为''则可能为转义字符char ch513="abfntv?'"0"/转义字符集ch=fgetc(fp);/预读一位for(int k=0;k<12;k+)/如果为转义字符则输出if(ch=ch5k)printf("line %d:%c%dn",hanjsq,ch,k+33);fprintf(fp1,"line %d:%c%dn",hanjsq,ch,k+33);if(ch='d' && isdigit(fgetc(fp) && isdigit(fgetc(fp)/任意字符转换为三位八进制 fseek(fp,-2,1);printf("line %d:%c%c44n",hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,"line %d:%c%c44n",hanjsq,fgetc(fp),fgetc(fp);if(ch='x' && isdigit(fgetc(fp) && isdigit(fgetc(fp)/任意字符转换为二位十六进制 fseek(fp,-2,1);printf("line %d:%c%c45n",hanjsq,fgetc(fp),fgetc(fp);fprintf(fp1,"line %d:%c%c45n",hanjsq,fgetc(fp),fgetc(fp);if(ch='%')/如果为'%'则可能为%s%c%dch=fgetc(fp);char bfh4="dcs"for(i=0;i<3;i+)if(bfhi=ch)printf("line %d:%c83n",hanjsq,ch);fprintf(fp1,"line %d:%c83n",hanjsq,ch);/*扫描其他符号*/if(!isdigit(ch) && !isalpha(ch) && ch!='_' && ch!='"' && ch!='/')char ch214="#()'*:%"/定义部分单符号集char ch39="+?=|&!<>"/定义部分单符号或双符号(前半部分)集char ch49="+=|&="/定义部分双符号(后半部分)for(int i=0;i<13;i+)/判断单个符号if(ch=ch2i)printf("line %d:%c%dn",hanjsq,ch,i+48);fprintf(fp1,"line %d:%c%dn",hanjsq,ch,i+48);for(int j=0;j<8;j+)/判断双符号if(ch=ch3j)/如果ch与ch3中第j个字符匹配ch=fgetc(fp);/预读一位/if(ch=10)hanjsq+;if(ch=ch4j)/且ch与ch4第j个匹配,则表示ch3j与ch4j连起来为一个双符号printf("line %d:%c%c%dn",hanjsq,ch3j,ch4j,i+69);fprintf(fp1,"line %d:%c%c%dn",hanjsq,ch3j,ch4j,i+69);if(ch='<' && ch3j='<')/判断'<<'符printf("line %d:<<77n",hanjsq);fprintf(fp1,"line %d:<<77n",hanjsq);if(ch='>' && ch3j='>')/判断'>>'符printf("line %d:>>78n",hanjsq);fprintf(fp1,"line %d:>>78n",hanjsq);else/否则表示ch3j为单符号,不是双符号的一部分printf("line %d:%c%dn",hanjsq,ch3j,j+61);fprintf(fp1,"line %d:%c%dn",hanjsq,ch3j,j+61);fseek(fp,-1,1);/*/printf("*n");printf("* 词法分析结束 *n");printf("* 分析结果保存在文件%s中 *n",outfile);printf("* 欢迎下次使用,谢谢! *n");printf("*n");fprintf(fp1,"*n");fprintf(fp1,"* 词法分析结束 *n");fprintf(fp1,"* 欢迎下次使用,谢谢! *n");fprintf(fp1,"*n");int guanjz(char ch1)/关键字和标识符判断char ch2329="auto","double","int","struct","break","else","long","switch","case","enum","register","typedef","char","extern","return","union","const","float","short","unsigned","continue","for","signed","void","default","goto","sizeof","volatile","do","while","static","if"/定义关键字集for(int i=0;i<32;i+)/逐个比对如果为关键字则返回类别i+1if(!strcmp(ch1,ch2i)return i+1;return 47;/否则返回一般标识符类总结: 指导教师签名: 2011年4月12日星期二

    注意事项

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

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




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

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

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

    收起
    展开