班级:2012211305姓名:戈策学号:2012211221词法分析程序实验报告一、实验内容设计并实现C语言的词法分析程序,要求如下:1)可以识别C语言编写的源程序中的每个单词符号,并以记号的形式输出每个单词。2)可以统计并读取源程序中的注释。3)可以统计源程序中的语句行数、单词个数和字符个数,并输出统计结果。其中回车换行不计入字符个数,空格不计算为单词。4)检查源程序中存在的错误,并可以报告错误所在的行列位置。5)发现源程序中存在错误后,进行适当的恢复,使词法分析可以继续进行,通过一次词法分析处理,可以检查并报告源程序中存在的所有错误。二、程序特色1)全部实现上述实验要求2)标识符规则符合标准C语言要求,允许以下划线开头,并包含下划线3)可识别C语言允许的所有无符号实数形式,包括整数和浮点数。其中浮点数可包含指数e或E,并遵循C语言允许省略整数部分(如.5表示0.5)或省略小数部分(如2.E2表示2.0*102)4)可识别几乎C语言所有标点符号和运算符,共计50个5)可正确识别字符和字符串中的转义字符,如‘\’和“abcd\”均可识别为单词不完整,并指出错误的行和列6)可识别C语言的两种注释,//和/**/,其中/**/按照C语言要求允许跨越多行班级:2012211305姓名:戈策学号:2012211221三、语言说明1)标识符:以字母或下划线开头,后跟字母、数字或下划线组成的字符串2)关键字:C语言所有32个关键字3)无符号数:C语言所允许的所有十进制实数形式,包括整数和浮点数。其中浮点数包括C语言允许的省略整数部分(如.5表示0.5)和省略小数部分(如2.E2表示2.0*102)4)算数运算符:+、++、-、--、*、/、%5)赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=6)关系运算符:、=、==、=、、!=7)逻辑运算符:&&、||、!8)位运算符:&、|、^、~、、9)其他符号:-、.、#、{、}、[、]、(、)、?、:、,、;、\10)字符:以单引号开始,以单引号结束,不能跨越多行11)字符串:以双引号开始,以双引号结束,不能跨越多行12)注释:以//开始到行末,或者以/*开始,以*/结束,可以跨越多行四、运行环境CodeBlocks-13.12withGCCcompilerfromTDM-GCC(4.7.1,32bit)五、输入形式命令行界面,指定C语言源文件作为输入六、输出形式1)所有标识符写入指定的符号表文件2)分离出一个单词后,对识别出的记号以二元式的形式输出到用户指定文件,班级:2012211305姓名:戈策学号:2012211221其形式为记号,属性记号属性记号属性IDkeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeykeynumarith-oparith-oparith-oparith-oparith-oparith-oparith-op符号表序号autodoubleintstructbreakelselongswitchcaseenumregistertypedefcharexternreturnunionconstfloatshortunsignedcontinueforsignedvoiddefaultgotosizeofvolatiledoifstaticwhile实数值+++---*/%asgn-opasgn-opasgn-opasgn-opasgn-opasgn-opasgn-opasgn-opasgn-oprel-oprel-oprel-oprel-oprel-oprel-oplog-oplog-oplog-opbit-opbit-opbit-opbit-opbit-opbit-opothersothersothersothersothersothersothersothersothersothersothersothersothersotherscharstringcomments=+=-=*=/=%=&=|=^=====!=&&||!&|^~-.#{}[]()?:,;\字符字面量字符串字面量-班级:2012211305姓名:戈策学号:2012211221七、主要数据结构vectorstringtable;//字符串向量,临时存储符号表setstringkeywords;//字符串集合,存放所有关键字stringbuffer;//输入缓冲区,存放文件的一行stringtoken;//字符串,存放当前单词string::iteratorforward;//字符串buffer的迭代器,向前扫描字符八、核心算法1)识别无符号数的有限状态自动机/*由上图构造相应的无符号数识别子程序*/voidget_digits(){while(forward!=buffer.end()&¬End){switch(state){case1:if(*forward=='.')state=23;elseif(*forward=='E'||'e')state==4;elseif(isdigit(*forward))state=1;elsenotEnd=fasle;s0s23starts1s4s5s6Errordigite/Edigitdigitothers..digitothersdigitdigitdigit+/-班级:2012211305姓名:戈策学号:2012211221break;case23:if(*forward=='E'||'e')state=4;elseif(isdigit(*forward))state=23;elsenotEnd=false;break;case4:if(*forward=='+'||'-')state=6;elseif(isdigit(*forward))state=5;else{Error;notEnd=false;break;case5:if(isdigit(*forward))state=5;elsenotEnd=false;break;case6:if(isdigit(*forward))state=5;else{Error;notEnd=false;}break;default:break;}}}2)/*读取一个字符后,如果是语言所定义的单词符号的开始字符,则转移到相应的识别识别过程,否则进入错误处理状态*/intmain(){init;openinfile,outfile,tablefile;while(true){if(getline(infile,buffer,'\n')==true){++line;班级:2012211305姓名:戈策学号:2012211221cnt_char+=column;column=0;forward=buffer.begin();}else{cnt_char+=column;writetabletotablefile;closeinfile,outfile,tablefile;outputtoconsole;}get_nbc;switch(C){case'a'...'z','A'...'Z','_':token.append;while(digit||letter||'_')token.append;if(iskey){table_insert();outfilekey;}elseoutfileID;break;case'0'...'9':token.append;state=1;get_digits();state=0;outfilenum;break;case'+','-','*','%':token.append;++forward;if(*forward=='=')outfileasgn-op;elseoutfilearith-op;break;case'/':token.append;++forward;班级:2012211305姓名:戈策学号:2012211221if(*forward=='=')outfileasgn-op;elseif(*forward=='/'){while(forward!=buffer.end())readcomments;outfilecomments;}elseif(*forward=='*'){if(get_comments())outfilecomments;elsecloseinfile,outfile,tablefile;}elseoutfilearith-op;break;case'&','|','^':token.append;++forward;if(*forward=='=')outfileasgn-op;elseif(*forward==*(forward-1))outfilelog-op;elseoutfilebit-op;break;case'~':token.append;++forward;outfilebit-op;break;case'','':token.append;++forward;if(*forward=='='){token.append;outfilerel-op;}elseif(*forward==*(forward-1)){token.append;班级:2012211305姓名:戈策学号:2012211221outfilebit-op;}elseoutfilerel-op;break;case'=':token.append;++forward;if(*forward=='=')outfilerel-op;elseoutfileasgn-op;break;case'!':token.append;++forward;if(*forward=='=')outfilerel-op;elseoutfilelog-op;break;case'\':token.append;++forward;while(*forward!='\'){token.append;++forward;if(*(forward-1)=='\\'){token.append;++forward;}}if(forward==buffer.end())Error;elseoutfilestring;break;case'\'':token.append;++forward;while(*forward!='\''){班级:2012211305姓名:戈策学号:2012211221token.append;++forward;if(*(forward-1)=='\\'){token.append;++forward;}}if(forward==buffer.end())Error;elseoutfilechar;break;case'.':token.append;++forward;if(isdigit){get_digits();outfilenum;break;}outfileothers;break;case'#':case'{':case'}':case'[':case']':case'(':case')':case'?':case':':case',':case';':case'\\':token.append;++forward;outfileothers;break;default:Error;}}}