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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

北邮编译原理词法分析报告器实验.docx

1、北邮编译原理词法分析报告器实验词法分析程序设计一问题描述1.可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。2.可以并识别读取源程序中的注释。3.可以统计源程序中的语句行数、单词个数和字符数,其中标点和空格不计为单词,并输出统计结果。4.检察源程序中存在的错误,并可以报告错误所在行列的位置。5.发现原程序中存在的错误,进行适当修复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。二算法思想编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词形成记号流文件输出。其中,具体子问题有:(1)源程序文件读入缓冲

2、区中(注意要删除空格和无用符号)(2)确定读入的为关键字还是运算符还是变量名,对于普通标识符和常量,分别建立标识符表和常量表当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则进入符号表或常量表中并返回表的入口地址。(3)对于各类运算符、标点符号、以及注释符号等,准确识别出来并打印输出结果(4)对于源文件中出现的数字常量,不但能按要求加入常量表中,还进行了字符型到float型数值的转换,便于后续程序操作处理。(4)尽量精简整合各种情况,使算法复杂度降低,精简易读。三、实验程序设计说明1.主要函数说明void readChar();/读字符过程,每调用一次,从输入缓冲区读一个

3、字符,并把它放入变量C中,且向前扫描指针pointer指向下一个字符void ignoreSpace();/每次调用时,检查C中的字符是否为空字符,若是,则反复调用该过程,直到C进入一个非空字符为止void link();/把C中的字符与token中的字符串连接起来bool alphabet();/布尔函数,判断C中的字符是否为字母,若是则返回true,否则返回falsebool digit();/布尔函数,判断C中的字符是否为数字,若是则返回true,否则返回falseint searchForKeywords();/查关键字表,若此函数的返回值为0,则表示token中的字符串是标识符,否则

4、为关键字int searchForToken();/查符号表,若此函数的返回值为0,则表示token中的字符串是新出现的,否则为已出现过的标识符int searchForNum(); /查常数表,若此函数的返回值为0,则表示token中的数字是新出现的,否则为已出现的常数void insertTokenList();/将标识符插入符号表void insertNumList();/将数字插入常数表void fillBuffer(int a);/ 填充buff的半区函数2程序源代码#include#include#include#includeint pointer=0;/int i=0,j=0,

5、c=0,appear,d=0,num_location;/int row_num=0,letter_num=0,word_num=0;int z=1;char C= ;/char token30;/char buff4095;/char token_list20030;/char number20010;/char next_charac,charac,file_name20;char keywords3210=auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int

6、,long,register,return,short,signed,sizeo,fstatic,struct,switch,typedef,union,unsigned,void,volatile,while;double num;FILE *file_pointer;void fillBuffer(int a)/ / i=0; while(!feof(file_pointer) & i=97 & C=65 & C=48 & C=57) return true; else return false; ;int searchForKeywords()/ for(int x=0;x32;x+)

7、if(strcmp(token,keywordsx)=0) return 0;/ return 1;int searchForToken()/ int i=0; while(i=c-1) if(strcmp(token,token_listi)=0) appear=i; return 0; / i+; word_num+; return 1;int searchForNum()/ int i=0; while(i=d-1) if(strcmp(token,numberi)=0) num_location=i; return 0; / i+; word_num+; return 1;void i

8、nsertTokenList()/ strcpy(token_listc+,token);void insertNumList()/ strcpy(numberd+,token);main() printf(输入源文件的路径:n); scanf(%s,file_name); file_pointer=fopen(file_name,r); if(file_pointer=NULL) printf(无法查找到文件,发生错误!n);/ charac=fgetc(file_pointer); fillBuffer(0);/ while(C!=0) readChar();/ ignoreSpace()

9、;/ switch(C) / case 65: case 66: case 67: case 68: case 69: case 70: case 71: case 72: case 73: case 74: case 75: case 76: case 77: case 78: case 79: case 80: case 81: case 82: case 83: case 84: case 85: case 86: case 87: case 88: case 89: case 90: case 97: case 98: case 99: case 100: case 101: case

10、 102: case 103: case 104: case 105: case 106: case 107: case 108: case 109: case 110: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119: case 120: case 121: case 122: case _:/򏂻 while(alphabet()|digit()|C=_)/ link();/ readChar();/ / tokenj=0;/ j=0;/ poin

11、ter-;/ if(searchForKeywords()=1)/ if(searchForToken()=1)/ insertTokenList();/ printf(n,c-1); else printf(n,appear); / else printf(n,token);/ break; case 48: case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: num=(C-48); link(); readChar(); while(digit() link(); num=num*

12、10+(C-48);/ readChar(); if(C=.) link(); readChar(); while(digit() link(); num=num+(C-48)*pow(0.1,z+);/ readChar(); tokenj=0;/ j=0;/ pointer-; if(searchForNum()=1)/ insertNumList();/ printf(n,num,d-1); else printf(n,num,num_location); / break; case +: readChar(); if(C=) printf(n); else if(C=+) printf

13、(n); else pointer-; printf(n); break; case -: readChar(); if(C=-) printf(); else if(C=) printf(n); else pointer-; printf(n); break; case *: printf(n);break; case /: readChar(); if(C=*) readChar(); next_charac=buffpointer; while(C!=* & next_charac!=/) readChar(); next_charac=buffpointer; readChar();

14、printf(n); else if(C=/) readChar(); while(C!=n) readChar(); printf(n); else pointer-; printf(n); break; case %: printf(n);break; case (: printf(n);break; case ): printf(n);break; case : printf(n);break; case : printf(n);break; case : printf(n);break; case : printf(n);break; case : printf(n);break; c

15、ase ;: printf(n);break; case ,: printf(n);break; case .: printf(n);break; case ?: printf(n);break; case : printf(n);break; case #: printf(n);break; case : readChar(); if(C=) printf(=, 大于等于 n); else pointer-; printf(, 大于 n); break; case : readChar(); if(C=) printf( n); else pointer-; printf( n); brea

16、k; case =: readChar(); if(C=) printf(n); else pointer-; printf(n); break; case &: readChar(); if(C=&) printf(n); else pointer-; printf(n); break; case |: readChar(); if(C=|) printf(n); else pointer-; printf(n); break; case !: readChar(); if(C=) printf(n); else pointer-; printf(n); break; printf(该源文件的行数为:%d,单词数为%d,字符数为%d.n,row_num,word_num,letter_num); system(pause); return 0;3程序的执行结果测试程序为:运行结果为: 四、有待改进的地方

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

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