- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北邮 编译原理 词法分析器实验
词法分析程序设计
一.问题描述
1.可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。
2.可以并识别读取源程序中的注释。
3.可以统计源程序中的语句行数、单词个数和字符数,其中标点和空格不计为单词,并输出统计结果。
4.检察源程序中存在的错误,并可以报告错误所在行列的位置。
5.发现原程序中存在的错误,进行适当修复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。
二.算法思想
编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词形成记号流文件输出。其中,具体子问题有:
(1)源程序文件读入缓冲区中(注意要删除空格和无用符号)
(2)确定读入的为关键字还是运算符还是变量名,对于普通标识符和常量,分别建立标识符表和常量表当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则进入符号表或常量表中并返回表的入口地址。
(3)对于各类运算符、标点符号、以及注释符号等,准确识别出来并打印输出结果
(4)对于源文件中出现的数字常量,不但能按要求加入常量表中,还进行了字符型到float型数值的转换,便于后续程序操作处理。
(4)尽量精简整合各种情况,使算法复杂度降低,精简易读。
三、实验程序设计说明
1.主要函数说明
void readChar();//读字符过程,每调用一次,从输入缓冲区读一个字符,并把它放入变量C中,且向前扫描指针pointer指向下一个字符
void ignoreSpace();//每次调用时,检查C中的字符是否为空字符,若是,则反复调用该过程,直到C进入一个非空字符为止
void link();//把C中的字符与token中的字符串连接起来
bool alphabet();//布尔函数,判断C中的字符是否为字母,若是则返回true,否则返回false
bool digit();//布尔函数,判断C中的字符是否为数字,若是则返回true,否则返回false
int searchForKeywords();//查关键字表,若此函数的返回值为0,则表示token中的字符串是标识符,否则为关键字
int searchForToken();//查符号表,若此函数的返回值为0,则表示token中的字符串是新出现的,否则为已出现过的标识符
int searchForNum(); //查常数表,若此函数的返回值为0,则表示token中的数字是新出现的,否则为已出现的常数
void insertTokenList();//将标识符插入符号表
void insertNumList();//将数字插入常数表
void fillBuffer(int a);// 填充buff的半区函数
2.程序源代码
#includestdio.h
#includestdlib.h
#includestring.h
#includemath.h
int pointer=0;//
int i=0,j=0,c=0,appear,d=0,num_location;//
int row_num=0,letter_num=0,word_num=0;
int z=1;
char C= ;//
char token[30];//
char buff[4095];//
char token_list[200][30];//
char number[200][10];//
char next_charac,charac,file_name[20];
char keywords[32][10]={auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,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)) i2048){//
buff[a+i]=charac;
if(charac!= ){//
if(charac==\n){
row_num++;//
}
else{
letter_num++;
您可能关注的文档
- 化工库区二期项目罐基工程施工组织设计.doc
- 化工机械基础1-2直杆的拉伸和压缩.ppt
- 化工电气5章.ppt
- 化工用泵日常设备点检培训.ppt
- 化工设备第一章小结.ppt
- 化工输送.ppt
- 化工过程强化及其在消化吸收引进技术中的应用.ppt
- 化工设备机械基础课程设计浮阀塔设计.doc
- 北京到临桂的行程.doc
- 北京品今资料新.ppt
- 福莱特玻璃集团股份有限公司海外监管公告 - 福莱特玻璃集团股份有限公司2024年度环境、社会及管治报告.pdf
- 广哈通信:2024年度环境、社会及治理(ESG)报告.pdf
- 招商证券股份有限公司招商证券2024年度环境、社会及管治报告.pdf
- 宏信建设发展有限公司2024 可持续发展暨环境、社会及管治(ESG)报告.pdf
- 品创控股有限公司环境、社会及管治报告 2024.pdf
- 中信建投证券股份有限公司2024可持续发展暨环境、社会及管治报告.pdf
- 洛阳栾川钼业集团股份有限公司环境、社会及管治报告.pdf
- 361度国际有限公司二零二四年环境、社会及管治报告.pdf
- 中国神华能源股份有限公司2024年度环境、社会及管治报告.pdf
- 广西能源:2024年环境、社会及治理(ESG)报告.pdf
文档评论(0)