资源描述:
《编译原理实验整体(2)词法分析器实验报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、词法分析器实验报告班级:1203105学号:1120310528姓名:陈向军一.实验冃的:编译原理是理论与实践并重的课程。在本次实验中,通过自己编写一个小型的词法分析器,进而在训练编程能力的同时,加深对编译过程中词法分析部分的理解。二.实验内容1.设计原理词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号理论基础:有限自动机、正规文法词法分析器:执行词法分析的程序2.词法分析器的功能和输出形式功能:输入源程序,输出单词符号(token)o即:把构成源程序的字符串转换成“等价的”单词
2、(记号)序列符号程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符3.输出的单词符号的表示形式:采用2元组形式,〈种别,属性值〉1.流程图:一.关键字:{,,breakl/,BREAK,'},{•'continue"J2/,C0NTINUEM},{“else",3,“ELSE”},{“float”,4,“FLOAT”},{“for”,5,”FOR“},{,,int,7/,INT,,}>{,,return,S/'RETURN1'},{"void9/,V0ID,'}J{,,wh
3、ile,,J10/,WHILE,,}?{“printf”,41,“OUTPUT”},{"scanf42/,INPUT,'}>{"main"^43,"MAIN"},{”function”,44,"function"}{,,+,,>16/,PLUSn},{”・”,17,“MINUS”},{”*",18「MULT:[”},{”/”J9「RDIV”},{”=”,20,“ASSIGN”},{”>“,22,”GT”},{”<=“,23,“LE”},{“>=”,24J'GE“},{”!=”,25,”NE”},26
4、,”LR_BRAC”},{“)”,27,”RR_BRAC”},{”,”,28,”COMMA”},{”;”,29,”SEMIC”},{“[”,30「LS_BRAC••},RS_BRAC”},32「LB_BRAC,{"},,J33/,RB_BRAC,,}J{”%”_,34「REMAINDER”},{”&&”,35,“AND”},{n
5、
6、,,J36/,OR,,}J{”!“,37,”NOT”},{”++”,38「INC”},{”==“,39,”EQ“},{”&“,40,”ADDR”}一.常量,字符串,注释的状
7、态转移图(DFA)常量:(浮点数,一)(浮点数,字符串:考虑到转义符的问题注释:\二.程序部分设计用字符串数组表示DFA:常量:publicstaticStringdigitDFA[]={〃#〃,〃###(!###〃,〃#####-d〃,〃######d〃,};字符串:publicstaticStringstConDFA[]={“#\d#“,”##a#“,”#\d“”,”####“};注释:publicstaticStringnoteDFA[]={“#“,“##*##”,"##c*#H,“##
8、//”,”#####“};常量的DFA处理:ints=1;Booleanisfloat=false;while(ch!=' '&&(isDigit(ch)IIch==7IIch=OIIch==T){isfloat=true;intk;for(k=1;k<=6;k++){chartmpstr[]=digitDFA[s].toCharAn^ayO;if(tmpstrfk]!='#'&&1==in_digitDFA(ch,tmpstr[k]))token+=ch;s=k;break;}}if(k>6)br
9、eak;i++;if(i>=strLineJength)break;ch=strLine[i];字符串DFA的处理:while(s!=3){i++;if(i>=strLine.length-1){haveMistake=true;break;ch=strLine[i];if(ch==、0'){haveMistake=true;break;}for(intk=0;k<4;k++){chartmpstrLJ=stConDFA[sJ.toCharArray();if(in_stConDFA(ch,tmpst
10、r[kj)){token1+=ch;if(k==2&&s==1){讦(isEsSt(ch))//是转义字符token=token+AX1+ch;elsetoken+=ch;}elseif(k!=3&&k!=1)token+=ch;s=k;break;注释DFA的处了讦(ch=={token+=ch;//ch==ints=2;while(s!=4){i++;if(i>=strLine.length)break;ch=strLine[i];//注意判断溢出!