版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/13 词法分析器设计自动机、正规文法、正规式序能和输出形式符号程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,3.输出的单词符号的表示形式:4.词法分析器的结构预处理子程序扫描缓冲区输入缓冲区扫描器词符号图实现2/13 字符/数字**2数字*45<>6*字符/数字错误:错误其他开始字符其他数字07==计名*/stringGetWordstringstrintiintj除去字符串中连续的空格和换行ullstringstrintiboolIsBoundary(stringstr,inti);boolIsOperation(stringstr,inti);3/13 vc是否为关键字,是的话,返回真,反之返回假*/assWordAnalyzer{liccharContent[MAXLENGTH];intval;voidprint();};r序PrintError,显示当前扫描到的字符与其所在行、列位置,并跳过该字符重#include<iostream>#include<vector>#include<string>#include<fstream>usingnamespacestd;/*用来存储目标文件名*/4/13 stringfile_name;stringGetText();/*获得一个单词符号,从位置i开始查找。//并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/stringGetWord(stringstr,inti,int&j);/*这个函数用来除去字符串中连续的空格和换行//第一个参数为目标字符串,第二个参数为开始位置//返回值为连续的空格和换行后的第一个有效字符在字符串的位置*/intDeleteNull(stringstr,inti);/*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/boolIsBoundary(stringstr,inti);/*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/boolIsOperation(stringstr,inti);/*此函数将一个pair数组输出到一个文件中*/voidOutFile(vector<pair<int,string>>v);/*次函数将参数str,digit添加到temp中*/voidadd(stringstr,intdigit,vector<pair<int,string>>temp);/*此函数承受一个字符串数组,对它进展词法分析,返回一个pair型数组*/vector<pair<int,string>>analyst(vector<string>vec);,是的话,返回真,反之返回假*/5/13 boolIsKey(stringstr);intmain(){cout<<"*********************************************************\n";cout<<"*************编译原理课程设计--词法编译器ver1.0*********\n";cout<<"*********************************************************\n";cout<<endl;string1="";string2="\n";stringfileline=GetText();intbegin=0,end=0;vector<string>array;{begin=DeleteNull(fileline,begin);stringnowString;nowString=GetWord(fileline,begin,end);if(end==-1)break;if(nowString.pare(1)&&nowString.pare(2))array.push_back(nowString);begin=end+1;}while(true);vector<pair<int,string>>mid_result;mid_result=analyst(array);OutFile(mid_result);cout<<"*********************************************************\n";cout<<"*********************************************************\n";6/13 system("pause");return0;}/stringGetText(){stringfile_name1;cin>>file_name1;ifstreaminfile(file_name1.c_str(),ios::in);if(!infile){"<<file_name1.c_str()<<"!!!"<<endl;exit(-1);}cout<<endl;charf[1000];infile.getline(f,1000,EOF);infile.close();printf(f);cout<<endl;returnf;}符号,从位置i开始查找。stringGetWord(stringstr,inti,int&j){stringno_use("(){},;\n+=*/-<>\"");j=str.find_first_of(no_use,i);if(j==-1)return"";if(i!=j)j--;returnstr.substr(i,j-i+1);7/13 }/*这个函数用来除去字符串中连续的空格和换行//第一个参数为目标字符串,第二个参数为开始位置//返回值为连续的空格和换行后的第一个有效字符在字符串的位置*/intDeleteNull(stringstr,inti){for(;;i++)if(str[i]!=''&&str[i]!='\n')returni;}boolIsBoundary(stringstr,inti){intt;chararr[7]={',',';','{','}','(',')',':'};for(t=0;t<7;t++)if(str[i]==arr[t])returntrue;returnfalse;}/*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/boolIsOperation(stringstr,inti){intt;chararr[8]={'+','-','*','/','=','<','>','&'};for(t=0;t<8;t++)if(str[i]==arr[t])returntrue;returnfalse;}/voidOutFile(vector<pair<int,string>>v){8/13 cin>>file_name;ofstreamoutfile(file_name.c_str(),ios::out);if(!outfile){"<<file_name.c_str()<<"!!!"<<endl;exit(-1);}cout<<endl;inti;for(i=0;i<v.size();i++){outfile<<"<"<<v[i].first<<",\""<<v[i].second<<"\">"<<endl;cout<<"<"<<v[i].first<<",\""<<v[i].second<<"\">"<<endl;}outfile<<"\n\n*********************************\n";outfile.close();return;}boolIsKey(stringstr){stringp[7]={"main","int","char","if","else","for","while"};vector<string>ppp(p,p+7);intu;for(u=0;u<ppp.size();u++)if(!str.pare(ppp[u]))returntrue;returnfalse;}/*此函数承受一个字符串数组,对它进展词法分析,返回一个pair型数组*/vector<pair<int,string>>analyst(vector<string>vec){vector<pair<int,string>>temp;inti;for(i=0;i<vec.size();i++)9/13 {if(vec[i].size()==1){if(vec[i]==">"&&vec[i+1]=="="){stringjk=vec[i];jk.append(vec[++i],0,1);pair<int,string>pp(37,jk);temp.push_back(pp);continue;}if(vec[i]=="<"&&vec[i+1]=="="){stringjk=vec[i];jk.append(vec[++i],0,1);pair<int,string>pp(38,jk);temp.push_back(pp);continue;}if(vec[i]=="="&&vec[i+1]=="="){stringjk=vec[i];jk.append(vec[++i],0,1);pair<int,string>pp(39,jk);temp.push_back(pp);continue;}if(vec[i]=="!"&&vec[i+1]=="="){stringjk=vec[i];jk.append(vec[++i],0,1);pair<int,string>pp(40,jk);temp.push_back(pp);continue;}if(vec[i]=="&"&&vec[i+1]=="&"){stringjk=vec[i];jk.append(vec[++i],0,1);pair<int,string>pp(42,jk);temp.push_back(pp);continue;}if(vec[i]=="|"&&vec[i+1]=="|")/13 {stringjk=vec[i];jk.append(vec[++i],0,1);pair<int,string>pp(43,jk);temp.push_back(pp);continue;}if(IsBoundary(vec[i],0)){if(vec[i]==","){pair<int,string>pp1(32,vec[i]);temp.push_back(pp1);}if(vec[i]==";"){pair<int,string>pp2(34,vec[i]);temp.push_back(pp2);}if(vec[i]=="{"){pair<int,string>pp3(30,vec[i]);temp.push_back(pp3);}if(vec[i]=="}"){pair<int,string>pp4(31,vec[i]);temp.push_back(pp4);}if(vec[i]=="("){pair<int,string>pp5(26,vec[i]);temp.push_back(pp5);}if(vec[i]==")"){pair<int,string>pp6(27,vec[i]);temp.push_back(pp6);}if(vec[i]==":"){pair<int,string>pp7(33,vec[i]);temp.push_back(pp7);} }elseif(IsOperation(vec[i],0)){if(vec[i]=="+"){pair<int,string>pp8(22,vec[i]);temp.push_back(pp8);}if(vec[i]=="-"){pair<int,string>pp9(23,vec[i]);temp.push_back(pp9);}if(vec[i]=="*"){pair<int,string>pp10(24,vec[i]);temp.push_back(pp10);}if(vec[i]=="/"){pair<int,string>pp11(25,vec[i]);temp.push_back(pp11);}if(vec[i]=="="){pair<int,string>pp12(21,vec[i]);temp.push_back(pp12);}if(vec[i]==">"){pair<int,string>pp13(35,vec[i]);temp.push_back(pp13);}if(vec[i]=="<"){pair<int,string>pp14(36,vec[i]);temp.push_back(pp14);}if(vec[i]=="&"){pair<int,string>pp26(41,vec[i]);temp.push_back(pp26);}} elseif(vec[i][0]<='9'&&vec[i][0]>='0'){pair<int,string>pp24(10,vec[i]);temp.push_back(pp24);}else{pair<int,string>pp25(10,vec[i]);temp.push_back(pp25);}}elseif(vec[i][0]<='9'&&vec[i][0]>='0'){pair<int,string>pp23(3,vec[i]);temp.push_back(pp23);}elseif(IsKey(vec[i])){if(vec[i]=="main"){pair
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度网络游戏开发运营合同
- 2024年度塔吊操作培训合同
- 2024合同书CIF合同书
- 2024全新血液透析培训
- 2024年家具加盟授权合同
- 2024国际货物买卖中检验检疫服务合同
- 公司管理年终工作总结
- 企业办公室励志标语8篇
- 2024年度××智能穿戴设备研发生产合同
- 2024年度钢材物流配送合同
- 血液净化标准操作规程
- 有限空间监理实施细则
- 我家乡宜兴介绍课件
- 4.2+酶催化细胞的化学反应(教学课件)-【知识精讲精研】高一生物 (沪科版2020必修1)
- 森林资源概况课件
- 胰腺癌的影像学表现课件
- 电梯维保报价单【模板】
- 2023年四川凉山州木里重点国有林保护局招聘18人笔试备考试题及答案解析
- 思想意识形态渗透就在你我身边
- 2023跨界联名营销趋势报告-SocialBeta
- 小学一年级写字教案()
评论
0/150
提交评论