北邮编译原理词法分析.docx
- 文档编号:28715992
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:19
- 大小:89.47KB
北邮编译原理词法分析.docx
《北邮编译原理词法分析.docx》由会员分享,可在线阅读,更多相关《北邮编译原理词法分析.docx(19页珍藏版)》请在冰豆网上搜索。
北邮编译原理词法分析
实验报告
编译原理与技术
ytinrete
程序设计1
题目:
词法分析程序的设计与实现。
实验内容:
设计并实现C语言的词法分析程序,要求如下。
(1)、可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。
(2)、可以识别并读取源程序中的注释。
(3)、可以统计源程序汇总的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果
(4)、检查源程序中存在的错误,并可以报告错误所在的行列位置。
(
(5)、发现源程序中存在的错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。
实验要求:
方法1:
采用C/C++作为实现语言,手工编写词法分析程序。
方法2:
通过编写LEX源程序,利用LEX软件工具自动生成词法分析程序。
算法思路:
首先通过遍历,统计行号和字符数,并记录所有的注释。
其次,再次读取,利用一个字符数组作为buffer保存一行的数据,在对其中的数据进行处理,完成之后再读下一行,跳过注释。
对于整行数据的处理,依靠空格将其分成单个单词再具体处理。
对于查错问题实在是一个难题,只能根据一些规则判定有错并记录。
-
程序源代码:
==*p||'E'==*p||'e'==*p)//小数和指数形式
{
(1,*p);
p++;
while(isdigit(*p))
{
(1,*p);
—
p++;
}
}
sum_word++;
(temp_word);
cout< "<<"无符号数: "< } } else if('#'==*p)//预处理文件特殊处理 & { while('\0'! =*p) { (1,*p); p++; } //p指向换行,完成直接退出 (temp_word); } else - if('"'==*p)//字符串 { (); p++; while('"'! =*p) { (1,*p); p++; } p++; : sum_word++; cout< "<<"字符串: "< } else if('+'==*p)//处理符号 { (); if('='==*(p+1))//自加 { temp_word="+="; ¥ (temp_word); sum_word++; cout< "<<"自加号: "< p+=2;//推进 } else if('+'==*(p+1))//自加1 { temp_word="++"; (temp_word); — sum_word++; cout< "<<"自加1号: "< p+=2;//推进 } else if(isdigit(*(p+1)))//有符号数 { temp_word="+"; for(intj=1;isdigit(*(p+j));j++) (1,*(p+j)); (temp_word); sum_word++; cout< "<<"有符号数: "< p+=2;//推进 } else { temp_word="+"; (temp_word); sum_word++; cout< "<<"加号: "< p+=2;//推进 } } else if('-'==*p)//处理符号 { (); if('='==*(p+1))//自减 { — temp_word="-="; (temp_word); sum_word++; cout< "<<"自减号: "< p+=2;//推进 } else if('-'==*(p+1))//自减1 { temp_word="--"; 、 (temp_word); sum_word++; cout< "<<"自减1号: "< p+=2;//推进 } else if(isdigit(*(p+1)))//有符号数 { temp_word="-"; for(intj=1;isdigit(*(p+j));j++) ~ (1,*(p+j)); (temp_word); sum_word++; cout< "<<"有符号数: "< p+=2;//推进 } else { temp_word="-"; (temp_word); : sum_word++; cout< "<<"减号: "< p+=2;//推进 } } else if('*'==*p)//处理符号 { (); if('='==*(p+1))//自乘 ! { temp_word="*="; (temp_word); sum_word++; cout< "<<"自乘号: "< p+=2;//推进 } else { temp_word="*"; [ (temp_word); sum_word++; cout< "<<"乘号: "< p+=2;//推进 } } else if('/'==*p)//处理符号 { ' (); if('='==*(p+1))//自除 { temp_word="*="; (temp_word); sum_word++; cout< "<<"自除号: "< p+=2;//推进 } else | if('/'==*(p+1))//行注释 return;//直接跳出 else if('*'==*(p+1))//多行注释 { in_comment=true; p+=2; while('\0'! =*p)//判断这行为止注释能不能结束 { if(('*'==*p)&&('/')==*(p+1)) { in_comment=false; break; } p++; } } else { temp_word="/"; — (temp_word); sum_word++; cout< "<<"除号: "< p+=2;//推进 } } else if('='==*p)//处理等号 { (); ¥ if('='==*(p+1))//比较 { temp_word="=="; (temp_word); sum_word++; cout< "<<"比较号: "< p+=2;//推进 } else { } temp_word="="; (temp_word); sum_word++; cout< "<<"赋值号: "< p+=2;//推进 } } else if('>'==*p) ) { (); if('='==*(p+1)) { temp_word=">="; (temp_word); sum_word++; cout< "<<"大于等于号: "< p+=2;//推进 } · else { temp_word=">"; (temp_word); sum_word++; cout< "<<"大于号: "< p+=2;//推进 } } 《 else if('<'==*p) { (); if('='==*(p+1)) { temp_word="<="; (temp_word); sum_word++; cout< "<<"小于等于号: "< & p+=2;//推进 } else { temp_word="<"; (temp_word); sum_word++; cout< "<<"小于号: "< p+=2;//推进 } [ } else if('! '==*p) { (); if('='==*(p+1)) { temp_word="! ="; (temp_word); ; sum_word++; cout< "<<"不等于号: "< p+=2;//推进 } else { temp_word="! "; (temp_word); sum_word++; cout< "<<"取反号: "< ' p+=2;//推进 } } else if(': '==*p||'('==*p||')'==*p||';'==*p||'{'==*p||'}'==*p||','==*p||'['==*p||']'==*p||'\0'==*p||'\n'==*p)//标点不算单词 { if('('==*p) small_bracket++;//查错 ` if(')'==*p) small_bracket--;//查错 if('{'==*p) big_bracket++;//查错 if('}'==*p) big_bracket--;//查错 p++;//推进 } else//非法字符 { ` cout< 在第"< "<<*p< p++; } } } voidanalyse(void)//循环填充buffer并进行词法分析 { char*p=buffer; (0);//文件指针回到头 ] while(! ()) { (*p); if('\n'==*p)//充满一句 { *(p+1)='\0'; *(p+2)='\0'; current_line++; word_analyse(); if(0! =small_bracket) , { cout< 在第"< "< small_bracket=0; } p=buffer;//重新填充 } else p++; { } if(0! =big_bracket) cout< 大括号不匹配! "< } voidshow_result(void)//显示统计结果 { cout< "< cout< "< cout< "< ¥ cout<<"thefollowingsareheader: "< for(inti=0;i<();i++) { cout<<(i); } cout<<"thefollowingsarecomment: "< for(inti=0;i<();i++) { cout<<(i); } $ } intmain(void) { (""); if(NULL==file) 》 cout< "< else { //开始处理 init();//初始化关键字 analyse(); (); sum();//统计行数字节数注释 show_result();//显示统计结果 } inttest; cin>>test; return0; } 实验结果测试: 正常文件 运行结果: 有问题文件: 运行结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 邮编 原理 词法 分析