您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 编译原理-词法分析(附源码)
词法分析实验报告一、实验项目名称词法分析二、实验目的通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。三、实验环境Windows10MicrosoftVisualStudio2015四、实验内容编制一个读单词过程,源程序为一个文件,读取该文件,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符五大类。并依次输出各个单词的内部编码及单词符号自身值。单词的内部编码如下:1、保留字:if、int、for、while、do、return、break、continue;单词种别码为1;2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列;单词种别码为2;3、常数为无符号整形数;单词种别码为3;4、运算符包括:+、-、*、/、=;单词种别码为4;5、分隔符包括:,、;、{、}、(、);单词种别码为5。五、实验步骤在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并填入适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。(1)定义部分:定义常量、变量、数据结构。(2)初始化:从文件将源程序全部输入到字符缓冲区中。(3)取单词前:去掉多余空白。(4)取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(5)显示结果六、源程序清单、测试数据、结果#includeiostream#includestring#includefstream#defineMAX100usingnamespacestd;voidmain(){//二维char数组主存储的初始化chara[MAX][15],ch='a',before;inti=0,j=0;for(i=0;iMAX;i++){for(j=0;j15;j++){a[i][j]=NULL;}}i=0;j=0;fstreamfile;//文件打开并读入字符file.open(D:\\text.txt,ios::in);if(file){cout文件打开成功endl;}while(!file.eof())//换行是10,空格是32{before=ch;file.read(&ch,1);//**********************************************************************符号*******************************************************************||||*************************************************************前一字符为符号当前为字母数字**********************************************************************************************************************************************************||if(((ch=32&&ch=47)||(ch==10)||(ch=58&&ch=64)||(ch=91&&ch=94)||(ch==96)||(ch=123&&ch=126))||(((before=32&&before=47)||(before==10)||(before=58&&before=64)||(before=91&&before=94)||(before==96)||(before=123&&before=126)))&&(ch65&&ch=90||ch=97&&ch=122||ch=48&&ch=57)){if(ch!=32&&ch!=10){i++;j=0;}}if(ch!=32&&ch!=10){a[i][j]=ch;j++;}}file.close();ofstreamfileout(D:\\out.txt,ios::ate);//判断字符串并输出for(intk=0;ki;k++){if(a[k][0]=65&&a[k][0]=90||a[k][0]=97&&a[k][0]=122)//判断第一个字符是字母{if(a[k][1]=65&&a[k][1]=90||a[k][1]=97&&a[k][1]=122)//判断第二个字符是字母{//判断是不是保留字stringAA(a[k]);if(AA.compare(if)==0){cout(1,\if\)endl;fileout(1,\if\)\n;}elseif(AA.compare(int)==0){cout(1,\int\)endl;fileout(1,\int\)\n;}elseif(AA.compare(for)==0){cout(1,\for\)endl;fileout(1,\for\)\n;}elseif(AA.compare(while)==0){cout(1,\while\)endl;fileout(1,\while\)\n;}elseif(AA.compare(do)==0){cout(1,\do\)endl;fileout(1,\do\)\n;}elseif(AA.compare(return)==0){cout(1,\return\)endl;fileout(1,\return\)\n;}elseif(AA.compare(break)==0){cout(1,\break\)endl;fileout(1,\break\)\n;}elseif(AA.compare(continue)==0){cout(1,\continue\)endl;fileout(1,\break\)\n;}else{cout(2,\AA\)endl;fileout(2,\AA\)\n;}}elseif(a[k][1]='0'||a[k][1]='9'){stringAA(a[k]);cout(2,\AA\)endl;fileout(2,\AA\)\n;}}elseif(a[k][0]='0'&&a[k][0]='9'){intjudge=0;intsss=1;while(a[k][sss]!=NULL){if(a[k][sss]'0'||a[k][sss]'9'){judge=1;}sss++;}stringAA(a[k]);if(judge==0){cout(3,\AA\)endl;fileout(3,\AA\)\n;}else{cout(错误的单词:AA\)endl;fileout(错误的单词:AA\)\n;}}elseif(a[k][0]==42||a[k][0]==43||a[k][0]==45||a[k][0]==47||a[k][0]==61){stringAA(a[k]);cout(4,\AA\)endl;fileout(4,\AA\)\n;}elseif(a[k][0]==44||a[k][0]==59||a[k][0]==40||a[k][0]==41||a[k][0]==123||a[k][0]==125){stringAA(a[k]);cout(5,\AA\)endl;fileout(5,\AA\)\n;}elseif(a[k][0]!=NULL){stringAA(a[k]);cout(不支持的符号:AA\)endl;fileout(不支持的符号:AA\)\n;}}fileout.close();}七、实验小结和思考在本次实验中,我遇到了很多小问题,值得一提的是在拆输入的字符串时如何拆分成正确的单词,这很重要,拆分单词时我用的是识别字符的ACSCii码以及字符前后的组合,将识别出的单词存入已初始化的字符数组中。
本文标题:编译原理-词法分析(附源码)
链接地址:https://www.777doc.com/doc-5726682 .html