词法分析器(c++语言描述).doc_第1页
词法分析器(c++语言描述).doc_第2页
词法分析器(c++语言描述).doc_第3页
词法分析器(c++语言描述).doc_第4页
词法分析器(c++语言描述).doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #include #include #include using namespace std;char buf1000;/用于保存文件中的文本的缓冲区string Get_text();/从文件中输入bool Is_key(string str);/判断否为关键字int Clear_space(string str,int n);/用来删除连续的空白和换行符string Get_words(string str,int n,int& m);/获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。bool Is_operation(string str,int n);/判断字符是否为一个运算符void Output_text(vectorpair v);/将词法分析结果输出bool Is_boundary(string str,int n);/判断字符是否为一个分界符vectorpair word_analyse(vector vec);/对一个字符串数组进行词法分析/*主函数*/int main() int start=0;int end=0;string single_string;/保存分析出来的单个词汇vector one_word_list;/保存分析出来的单个词汇的总表vectorpair analyse_result;/最终结果以二元组的形式保存在vector容器中 cout*n; cout*欢迎使用词法分析器*nn;cout(当前文件夹下Input.txt作为输入,Output.txt作为输出)n; cout*n; string file_text=Get_text();/file_text保存全部文本信息while(1) start=Clear_space(file_text,start); single_string=Get_words(file_text,start,end); if(end=-1) break; one_word_list.push_back(single_string); start=end+1; ; analyse_result=word_analyse(one_word_list); Output_text(analyse_result); cout*n; cout*词法分析已完成,结果保存在Output.txt文件中!*n; cout*n; getchar();return 0;/这个函数用来除去字符串中连续的空格和换行。第一个参数为目标字符串,第二个参数为开始位置。返回值为连续的空格和换行后的第一个有效字符在字符串的位置int Clear_space(string str,int n) while(1) if(strn!= &strn!=n) return n;n+;/获得一个单词,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在原字符串的位置。string Get_words(string str,int n,int& m)string separator_list(), ;n+-*/=#);/分隔符表 m=str.find_first_of(separator_list,n);/find_first_of返回匹配被查找字符串中某个字符的第一次出现位置 if(m=-1) return ; if(n!=m) m-; return str.substr(n,m-n+1);/返回字符串的子集,位置为i后面的j-i+1个字符/判断i当前所指的字符是否为一个分界符,是的话返回真,反之假bool Is_boundary(string str,int n) int nn;char boundary_list7=,;,(,),#; for (nn=0;nn7;nn+) if(strn=boundary_listnn) return true; return false;/判断i当前所指的字符是否为一个运算符,是的话返回真,否则返回假bool Is_operation(string str,int n) int nn; char operation_list7=+,-,*,/,=,; for (nn=0;nn7;nn+) if(strn=operation_listnn) return true; return false;/将文本的全部信息保存在全局字符数组buf1000中string Get_text() ifstream infile(Input.txt,ios:in); if (!infile) cerr无法打开Input.txt文件!endl; exit(-1); coutendl; infile.getline(buf,1000,EOF); infile.close(); return buf;/将分析结果输出void Output_text(vectorpair v) ofstream outfile(Output.txt,ios:out); if (!outfile) cerr无法打开文件Output.txt !endl; exit(-1); coutendl; for(int n=0;nv.size();n+) outfilevn.first , vn.secondendl; outfile分析结束; outfile.close(); return;/判断否为关键字,是则返回真,否则返回假bool Is_key(string str)string key_list19=char,short,int,long,float,double,for,while,do,break,continue,switch,case,return,if,cout,cin,endl,return;/关键字表vector temp(key_list,key_list+19);for(int n=0;ntemp.size();n+)if(!pare(tempn)return true;return false;/对一个字符串数组进行词法分析,返回一个pair型容器vectorpair word_analyse(vector vec) vectorpair temp; for(int i=0;ivec.size();i+) if(veci.size()=1) if(veci=+&veci+1=+)|(veci=-&veci+1=-)/判断+,-符号 string jk=veci; jk.append(vec+i,0,1); pair pp(4,jk); temp.push_back(pp); continue; if(veci=|veci=|veci=!|veci=)&veci+1=)/判断= ,= ,!=符号 string jk=veci; jk.append(vec+i,0,1); pair pp(4,jk); temp.push_back(pp); continue; if(veci=&veci+1=&veci+1=)/判断符号 string jk=veci; jk.append(vec+i,0,1); pair pp(4,jk); temp.push_back(pp); continue; if(Is_key(veci) pair pp(1,veci); temp.push_back(pp); else if(veci0=0) pair pp(3,veci); temp.push_back(pp); else if(Is_operation(veci,0) pair pp(4,veci); temp.push_back(pp); else if(Is_boundary(veci,0) pair pp(5,veci); temp.push_back(pp); else pair pp(2,veci); temp.push_back(pp); return temp;词法分析器文档1:表示关键字,支持

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论