资源描述:
《词法分析器C语言》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、【实验目的】1.熟悉词法分析的基本原理,词法分析的过程以及词法分析屮要注意的问题。2.复习高级语言,进一步加强用高级语言来解决实际问题的能力。3.通过完成词法分析程序,了解词法分析的过程。【实验内容】用C语言编写一个PL/O词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常数以及界符)输出。【实验步骤和要求】1•词法分析过程的流程图2•每个模块的源代码〃对关键字等实现初始化voidinit(){inti;for(i=0;i<=255;i++){ssym[i]
2、=nul;)ssym['+‘]二plus;ssym[-f]-minus;ssym严]-times;ssym[7‘]一slash;ssym[,(/]=lparen;ssym[T]=pe「iod;ssym[')‘]二rparen;ssym[-*]=eql;ssym[T]二comma;ssym
3、/#】=neq;ssyml^^semicolon;strcpy(&(word[01f01)/,beginH);strcpy(&(word[2][0]),"const");strcpy(&(word[4][0]),"end");strcpy(&(word[6][0]),H
4、odd");strcpy(&(word⑻[0]),"read”);strcpy(&(word[10][0]),”var“);strcpy(&(woni[12][0]),”wrilc”);strcpy(&(word[l][0]);,calF,);strcpy(&(word[3][0]),udoM);strcpy(&(word⑸[0]strcpy(&(wordl7][0J),"procedure");strcpy(&(word[9][0]),"program”);strcpy(&(word]11][()]),“while");strcpy(&(word]13
5、][0]),”lhc】T');wsym[2J=constsym;wsym[5]=ifsym;wsym[8]=readsym;wsym[ll]=whilesym;wsym[0J=beginsym;wsym[l]=callsym;wsym[3]=dosym;wsym[4]=endsym;wsym[6]=oddsym;wsymf7]=procsym;wsym[9]=programsym;wsym[10]=varsym;wsym[12]=writesym;wsym[13]=thensym;〃读取源文件并判断单词类别voidgetsym(){longm;chari
6、d[al+l],a[al+l];inti,k,n=0;init();if(ch==,l
7、ch==10
8、
9、ch==9){ch=fgetc(fin);}〃去除空格、制表符、换行符else{if(ch>=,a,&&ch<=,z,
10、
11、ch>=,A,&&ch<=,Z,){〃判断是否保留字k=0;do{if(k=*a'&&ch<=,z,
12、
13、ch>=,0'&&chv=9
14、
15、ch>=A&&ch<=,Z,);afk]=O;strcpy(id,a);for(i=0;i16、f(strcmp(id,word[i])==0){sym=wsym[i];n=l;if(i==7){printf(H%stt%ssym(保留字)”,id,id);fprintf(fout,"%stt%ssym(保留字)”,id,id);}else}printf("%sttt%ssym(保留字)",id,id);fprintf(fout,"%sttt%ssym(保留字)",id,id);}break;}}if(n==O){sym=ident;printf("%stttident(标识符)",id);fprint
17、f(fout,"%stttident(标识符)”,id);}}else{if(ch>=,0•&&chv=9){k=0;m=0;sym二number;do{m=10*m+ch-0,;k++;ch=getc(fin);}while(ch>=*0'&&ch<=,9,);if(k>=nmax)(printf("tERROR!数值太大!”);printf("%dtttnumber(常数)'*,m);fprintf(fout,H%dtttnumber(常数)",m);}else{if(ch==':,){ch=getc(fin);i
18、f(ch=-=,)〃判断是否标识符〃判断是否数字〃判断是否运算符、界符sym=b