




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告班级:姓名: oneseven学号:一题目:词法分析程序设计与实现二实验内容:设计并实现 C 语言的词法分析程序,要求如下。(1) 可以识别出用C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词符号。(2) 可以识别并读取源程序中的注释。(3) 可以统计源程序中的语句行数、单词个数和字符个数,其中标点和空格不计算为单词,并输出统计结果。(4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。三实现要求:采用C/C+作为实现语言,手工编写词法分析程序。四实现功能:基本完成了实验内容中要求的所有功能。(1)识别出源程序中的每个单词符号,并以记号的形式输出每个单词符
2、号(2)识别并读取源程序中的注释(3) 统计源程序中的语句行数、单词个数和字符个数(4) 检查源程序中存在的非法字符错误,并可以报告错误所在的行列位置。注:本程序未把注释中的单词符号,“”中的单词符号统计在单词个数中。单词个数只包括了标示符,关键字,无符号数。五实验原理:1.词法分析程序的功能:输入源程序,输出单词符号的记号形式,如图所示:词法分析器 源程序词法分析器 单词符号的记号形式2.处理过程:每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,并形成相应的单词串形式的源程序。六代码#include #include#include#include
3、using namespace std;string keyword32=auto,break,case,char,const, /关键字 continue,default,do,double,else,extern, enum,float,for,goto,if,int,long,return, register,static,short,signed,unsigned, struct,switch,sizeof,typedef,union, volatile,void,while;int column=0,row=1,character=0,word=0; ifstream inf(tes
4、t.txt,ios:in);char c;int find_key(string word) /匹配关键字 for(int i=0;i32;i+) if(pare(word)=0) return 1; return 0; void choice() while(c=n|c= |c=t) /不计空白符 if (c=n) row+; column=0; /row清零,重新计数另一行 c=inf.get(); column+; return; void get() /读取字符 character+; c=inf.get(); column+; return; int proc
5、ess() string str=; if(inf.fail() cout请创建test.txt并输入程序endl; else ofstream outf(out.txt); outfsetw(10)正规表达式setw(30)记号setw(30)属性endl; c=inf.get(); column+; while(c!=EOF) switch(c) /匹配字符对应记号 case a.z: case A.Z: case _: word+; while(isalpha(c)|isdigit(c)|c=_) str+=c; get(); if(c=|c=?|c=$|c=#) int tag=col
6、umn; while(isalpha(c)|isdigit(c)|c=_|c=|c=?|c=$|c=#) str+=c; get(); outfsetw(10)strsetw(30)ERRORsetw(30)错误在第row行第tag列endl; str=; break; if(find_key(str) outfsetw(10)strsetw(30)strsetw(30)关键字endl; str=; else outfsetw(10)strsetw(30)idsetw(30)标示符endl; str=; break; case 0.9: word+; while(isdigit(c)|c=.|
7、c=e|c=E) str+=c; if(c=e|c=E) get(); str+=c; get(); if(isalpha(c) int tag=column; while(isalpha(c)|c=_|isdigit(c)|c=|c=?|c=$|c=#) str+=c; get(); outfsetw(10)strsetw(30)ERRORsetw(30)错误在第row行第tag列endl; str=; break; outfsetw(10)strsetw(30)numsetw(30)无符号数: get(); if(c=) outfsetw(10)=setw(30)relopsetw(30)
8、关系运算符) outfsetw(10)setw(30)bit_opsetw(30)位运算符endl; else outfsetw(10)setw(30)relopsetw(30)关系运算符endl; break; get(); break; case: get(); if(c=) outfsetw(10)=setw(30)relopsetw(30)关系运算符endl; else if(c=) outfsetw(10)setw(30)bit_opsetw(30)位运算符endl; else outfsetw(10)setw(30)relopsetw(30)关系运算符endl; break; ge
9、t(); break; case=: get(); if(c=) outfsetw(10)=setw(30)relopsetw(30)关系运算符endl; else outfsetw(10)=setw(30)assign_opsetw(30)赋值符endl; break; get(); break; case!: get(); if(c=) outfsetw(10)!=setw(30)relopsetw(30)关系运算符endl; else outfsetw(10)!setw(30)logic_opsetw(30)逻辑运算符endl; break; get(); break; case|: g
10、et(); if(c=|) outfsetw(10)|setw(30)relopsetw(30)逻辑运算符endl; else outfsetw(10)|setw(30)logic_opsetw(30)位运算符endl; break; get(); break; case&: get(); if(c=&) outfsetw(10)&setw(30)relopsetw(30)逻辑运算符endl; else outfsetw(10)&setw(30)logic_opsetw(30)位运算符endl; break; get(); break; case+: get(); if(c=+) outfse
11、tw(10)+setw(30)alg_opsetw(30)运算符endl; else if(c=) outfsetw(10)+=setw(30)alg_opsetw(30)运算符endl; else outfsetw(10)+setw(30)alg_opsetw(30)运算符endl; break; get(); break; case-: get(); if(c=-) outfsetw(10)-setw(30)alg_opsetw(30)运算符endl; else if(c=) outfsetw(10)-=setw(30)alg_opsetw(30)运算符endl; else outfset
12、w(10)-setw(30)alg_opsetw(30)运算符endl; break; get(); break; case*: get(); if(c=) outfsetw(10)*=setw(30)alg_opsetw(30)运算符endl; else outfsetw(10)*setw(30)alg_opsetw(30)运算符endl; break; get(); break; case : str+=c; get(); while(c!=) str+=c; get(); if(c= |c=t) character-; str+=; outfsetw(10)strsetw(30)lite
13、ralsetw(30)字符串endl; str=; get(); break; case/: str+=c; get(); if(c=) outfsetw(10)/=setw(30)alg_opsetw(30)运算符endl; else if(c=/) str+=c; get(); while(c!=n&c!=EOF) str+=c; get(); character-; outfsetw(10)strsetw(30)annotationsetw(30)注释endl; else if(c=*) str+=c; get(); char tag=c; while(tag!=*&c!=/&c!=EO
14、F) str+=c; tag=c; choice(); get(); str+=c; outfsetw(10)strsetw(30)annotationsetw(30)注释endl; else outfsetw(10)/setw(30)alg_opsetw(30)运算符endl; str=; break; str=; get(); break; case : case n: case EOF: break; default: outfsetw(10)csetw(30)csetw(30)符号endl; get(); break; choice(); outf语句行数:rowendl; outf单词个数:wordendl; outf字符个数:characterendl; inf.close(); outf.close(); return 1; inf.close(); return 0; int main() in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论