编译原理词法分析程序设计实验报告【实验目的】1.了解词法分析的主要任务。2.熟悉编译程序的编制。【实验内容】根据某文法,构造一基本词法分析程序。找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词的种类和值。【实验要求】1.构造一个小语言的文法类C小语言文法(以EBNF表示)程序::=分程序{分程序}.分程序::=标识符’(’变量说明部分{,变量说明部分}’)’函数体变量说明部分::=int标识符{,标识符}函数体::=’{’[变量说明部分;]语句序列’}’语句序列::=语句序列;语句|语句语句::=赋值语句|条件语句|循环语句|函数调用语句赋值语句::=标识符=表达式表达式::=[+|-]项{加法运算符项}项::=因子{乘法运算符因子}因子:=标识符|无符号整数加法运算符::=+|-乘法运算符::=*|/条件语句::=if条件’{’语句序列’}’[else’{’语句序列’}’]条件::=表达式关系运算符表达式关系运算符::===|!=|||=|=循环语句::=for’(’表达式;条件;表达式’)’’{’语句序列’}’函数调用语句::=标识符’(’标识符{,标识符}|空’)’标识符::=字母{字母|数字}无符号整数::=数字{数字}字母::=a|b|c|…|X|Y|Z数字::=0|1|2|…|8|9单词分类情况关键字:intifelsefor标识符:以字母开头的字母和数字的组合关系运算符:==|!=|||=|=加法运算符:+|-乘法运算符:*|/界符:,;{}()2.设计单词的输出形式,单词的种类和值的表示方法种别码单词值如:1int3.编写词法分析程序cffx.c实现基本的词法分析器,能够分析关键字、标识符、数字、运算符(需要有“==”或“:=”之类需要超前搜索的运算符)以及其他一些符号。//编译原理词法分析程序.cpp#includestdio.h#includestdlib.h#includestring.htypedefstructwords{intid;charname[20];charvalue[20];}word;charinteger[20]={'i','n','t'};chariff[20]={'i','f'};charelsee[20]={'e','l','s','e'};charforr[20]={'f','o','r'};intmain(){charcode[10000];charwords[20],ch;inti,j,p,count,n,m;intk=0;wordsymbol[500];printf(种别码:1类别:关键字int\n);printf(种别码:2类别:关键字if\n);printf(种别码:3类别:关键字else\n);printf(种别码:4类别:关键字for\n);printf(种别码:5类别:标识符\n);printf(种别码:6类别:计算运算符\n);printf(种别码:7类别:关系运算符\n);printf(种别码:8类别:界符\n);while(1){gets(code);n=strlen(code);for(m=0,j=0;mn;m++){if((code[m]='a'&&code[m]='z')||(code[m]='0'&&code[m]='9')){words[j]=code[m];j++;}else{if(words[0]=='i'&&words[1]=='n'&&words[2]=='t'&&words[3]=='\0'){symbol[k].id=1;for(i=0;i20;i++){symbol[k].value[i]=words[i];}k++;}elseif(words[0]=='i'&&words[1]=='f'&&words[2]=='\0'){symbol[k].id=2;for(i=0;i20;i++){symbol[k].value[i]=iff[i];}k++;}elseif(words[0]=='e'&&words[1]=='l'&&words[2]=='s'&&words[3]=='e'&&words[4]=='\0'){symbol[k].id=3;for(i=0;i20;i++){symbol[k].value[i]=elsee[i];}k++;}elseif(words[0]=='f'&&words[1]=='o'&&words[2]=='r'&&words[3]=='\0'){symbol[k].id=4;for(i=0;i20;i++){symbol[k].value[i]=forr[i];}k++;}else{symbol[k].id=5;for(i=0;i20;i++){symbol[k].value[i]=words[i];}k++;}for(p=0;p20;p++){words[p]=0;}j=0;if(code[m]=='+'){symbol[k].id=6;symbol[k].value[0]='+';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='-'){symbol[k].id=6;symbol[k].value[0]='-';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='*'){symbol[k].id=6;symbol[k].value[0]='*';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='/'){symbol[k].id=6;symbol[k].value[0]='/';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='='&&code[m+1]!='='){symbol[k].id=6;symbol[k].value[0]='=';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='='&&code[m+1]=='='){symbol[k].id=7;symbol[k].value[0]='=';symbol[k].value[1]='=';for(i=2;i20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]=='!'&&code[m+1]=='='){symbol[k].id=7;symbol[k].value[0]='!';symbol[k].value[1]='=';for(i=2;i20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]==''&&code[m+1]=='='){symbol[k].id=7;symbol[k].value[0]='';symbol[k].value[1]='=';for(i=2;i20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]==''&&code[m+1]=='='){symbol[k].id=7;symbol[k].value[0]='';symbol[k].value[1]='=';for(i=2;i20;i++){symbol[k].value[i]=0;}k++;m++;}if(code[m]==''){symbol[k].id=7;symbol[k].value[0]='';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]==''){symbol[k].id=7;symbol[k].value[0]='';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]==','){symbol[k].id=8;symbol[k].value[0]=',';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]==';'){symbol[k].id=8;symbol[k].value[0]=';';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='('){symbol[k].id=8;symbol[k].value[0]='(';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]==')'){symbol[k].id=8;symbol[k].value[0]=')';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='{'){symbol[k].id=8;symbol[k].value[0]='{';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}if(code[m]=='}'){symbol[k].id=8;symbol[k].value[0]='}';for(i=1;i20;i++){symbol[k].value[i]=0;}k++;}}count=k;}system(cls);for(i=0;icount;i++){printf(%d,symbol[i].id);printf(%s\n,symbol[i].value);}}return0;}4.生成并输出单词符号表识别单词的状态转换图:016字母其他符号字母或数字2数字数字7其他符号3字符a8字符a4字符b9‘=’5字符c5.流程图开始初始化输入语句字母或数字?暂存进wordsWords内是否为关键字存入symbol结构体(关键字)存入symbol结构体(标识符)否是是否输入的字符是否为计算运算符存入symbol结构体(计算运算符)是否为关系运算符是否为界符是否否存入symbol结构体(关系运算符)存入symbol结构体(界符)是是否输出symbol结束输入错误6.源程序清单inta,b,c;a=b+c;7.测试结果8.实验心得:此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c语言直接编写词法分析器;同时更熟练的掌握用c语言编写程序,实现一定的实际功能。通过本次实验,使我更深层次的掌握了词法分析。从刚开始的无从下手到后来渐渐的突破了各个难关,虽然花了大量的时间和精力,但在我看来这绝对是值得的。起码让我明白了,光有理论是苍白无力的,我们必须将他附注于实践才能升华。