1、数学与信息工程学院编译原理实验报告一实验名称:词法分析 实 验 室:6202班 级:09 计算机 3 班姓 名:沈春晖学 号:0929210062词法分析器的设计一、 实验目的通过完成词法分析程序,了解词法分析的过程。编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。二、 实验环境操作系统:window xp编写环境:visual c+ 、c-free、turbo c编写语言:c 语言分析语言:PL/0三、 实验内容对 PL/0 语言进行词法分析,把输入的字符串形式的源程序分割成一
2、个个单词符号,其词法描述如下:(1) 关键字:begin, call,const ,do , end,if ,odd,procedure,read,then ,var ,while,write(2) 标识符:用来表示各种名字,必须以字母开头小于 10 位字符组成(3) 数字:以 0-9 组成小于 14 位的数字(4) 运算符:+,-,*, /,:=,=(5) 界符:,,.,;,#表 1 各种单词符号对应类型表单词符号 类型+ plus- minus* times/ slash( lparen) rparen= eql, comma. perio# neq; semicolonbegin beg
3、insymcall callsymconst constsymdo dosymend endsymif ifsymodd oddsymprocedure proceduresymread readsymthen thensymvar varsymwhile whilesymwrite writesymNNYY开始调用 GETSYM 取单词输入要分析的文件文件是否存在文件是否结束结束打印分析结果图 1 主流程图YNNNNNYYYYGETSYM滤空 CH=空?GETCHCH 是字母?K:=0K=、:=、#include “string.h“#define al 10 /*符号的最大长度*/#def
4、ine norw 13 /*关键字个数*/#define namx 14 /*数字允许的最长位数*/FILE *fin;FILE *fout;char fnameal,fwnameal,aal+1/*a50*/,idal+1,sym20;static char sword11=+,-,*,/,(,),=,.,#,;static char ssym11al=“plus“,“minus“,“times“,“slash“,“lparen“,“rparen“,“eql“,“comma“,“period“,“neq“,“semicolon“;static char word13al=“begin“,“c
5、all“,“const“,“do“,“end“,“if“,“odd“,“procedure“,“read“,“then“,“var“,“while“,“write“;/保留关键字static char wsym13al=“beginsym“,“callsym“,“constsym“,“dosym“,“endsym“,“ifsym“,“oddsym“,“procsym“,“readsym“,“thensym“,“varsym“,“whilesym“,“writesym“;/关键字类型int cc,ll,cx,linecount,num;char line81;char ch;void main(
6、)int getsym();printf(“*编译原理实验PL/0语言词法分析*n“);printf(“请输入进行词法分析的文件名:“);scanf(“%s“,fname);fin=fopen(fname,“r“);printf(“请输入分析结果保存的文件名:“);scanf(“%s“,fwname);fout=fopen(fwname,“w“);linecount=0;/记录文件的行数cc=ll=0;ch= ;if(fin)printf(“n-开始词法分析-n“);fprintf(fout,“-开始词法分析-n“);printf(“单词自身的值 单词种别n“);fprintf(fout,“单
7、词自身的值 单词种别n“);while( getsym()!=-1 )printf(“%-20s“,a);fprintf(fout,“%-20s“,a);printf(“%s“,sym);/输出单词种别fprintf(fout,“%s“,sym);printf(“n“);fprintf(fout,“n“);printf(“%-20s“,a);fprintf(fout,“%-20s“,a);printf(“%s“,sym);/输出单词种别fprintf(fout,“%s“,sym);printf(“n程序分析完毕“);fprintf(fout,“n程序分析完毕“);elseprintf(“你输入
8、的文件不存在“);fprintf(fout,“你输入的文件不存在“);void error(int rowcount,int wordcount)printf(“!第%d行第%d个位置数字越界n“,rowcount,wordcount);fprintf(fout,“!第%d行第%d个位置数字越界n“,rowcount,wordcount);int getch()if(cc=ll)/缓冲是否被读取完毕if(feof(fin)return -1; ll=0;cc=0;ch= ;while(ch!=10)if(EOF=fscanf(fin,“%c“,break;linell=ch;ll+;linec
9、ount+;printf(“开始分析程序的第%d行n“,linecount);fprintf(fout,“开始分析程序的第%d行n“,linecount);ch=linecc;cc+;return 0;int getsym()int i,j,k;while(ch= | ch=10 | ch=9 )/*判断字符是否为空,空跳过取下一个字符*/if(-1=getch()return -1;if(ch=a while(ij)strcpy(sym,wsymk);elsestrcpy(sym,“ident“);if(b=1) return -1;elseif(ch=0 /错误处理,数字越界else/如果
10、是计算、比较符号a0=ch;if(ch=:)if(-1=getch()a1=0;return -1;if(ch=)strcpy(sym,“becomes“);a1=ch;a2=0;if(-1=getch() return -1;elsea1=0;strcpy(sym,“nul“);/不可识别符号elseif(ch=)if(-1=getch() a1=0;return -1;if(ch=)a1=ch;a2=0;strcpy(sym,“geq“);if(-1=getch() return -1;elsea1=0;strcpy(sym,“gtr“);else/单字符符号处理i=0;a1=0;while(i11 if(i11)strcpy(sym,ssymi);if( strcmp(sym,“period“)!=0 )if(-1=getch() return -1;elsereturn -1;elseprintf(“不可识别的字符n“);/非字符开头处理结束return 0;