资源描述:
《词法分析 编译原理 课程实验》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《编译原理》课程实验实验一:词法分析1、实验目的:设计、编制并调试一个词法分析程序,加深对词法分析程序的理解。2、实验要求:(1)能识别关键字、运算符号、界符、标识符、数字(无符号整数、实数(4分)、科学计数法表示的数(5分))(2)要求建立一张关键字和种别码表(3)源程序从键盘输入(4分)、源程序以文件的形式输入(5分)typedefstructnode{charname[20];intdata;structnode*next;}*linklist,lnode;structkey{charname[20];i
2、ntnumber;}kword[]={{"int",1},{"float",2},{"if",3},{"switch",4},{"while",5},{"do",6},{"main",7},{"double",8},{"char",9},{"else",12},{"for",18},{"case",19},{"+",13},{"-",14},{"*",15},{"/",16},{"=",17},{"<",20},{"<=",21},{"==",22},{"!=",23},{">",24},{">=",25},{
3、"{",31},{"}",32},{";",26},{"(",27},{")",28},{"?",29},{":",30}};/*定义一个静态表*/#include#include#includeintmain(){FILE*fp,*fp1;charstring[81];linklistH,p,r;chara[20];charch;charstr[]="##########################";inti,j=0,k=0,f=0,n=0,
4、t=0;H=(linklist)malloc(sizeof(lnode));H->next=NULL;r=H;if((fp=fopen("test.txt","r"))==NULL){printf("不能打开文件");return0;}while(fgets(string,81,fp)!=NULL)/*读取一行字符存入string中*/{if(!strcmp(string,str))/*判断string中是否是'##########################'*/{p=(linklist)mall
5、oc(sizeof(lnode));strcpy(p->name,str);p->data=100;r->next=p;r=p;printf("编译下一段程序");continue;}else{i=0;n++;ch=string[i];while(ch==''
6、
7、ch=='t'
8、
9、ch=='')/*滤去空格*/{i++;ch=string[i];}while(string[i]!=' '&&string[i]!='')/*进行字符匹配*/{p=(linklist)malloc(siz
10、eof(lnode));if(ch>='a'&&ch<='z')/*对于以字符开头的匹配操作*/{a[j]=ch;j++;i++;ch=string[i];t=0;/*标志量*/while(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!=';'&&ch!='('&&ch!=')'&&ch!='?'&&ch!=':'&&ch!='{'&&ch!='}'&&ch!='<'&&ch!='>'&&ch!='='&&ch!='!'&&ch!=''){if((ch<'a'
11、
12、ch>'z')&
13、&(ch<'0'
14、
15、ch>'9'))t=1;/*为非法标识符的t置*/a[j++]=ch;i++;ch=string[i];}a[j]=' ';if(t==1)/*t为判断为非法字符*/{printf("第%d行%s编译出错",n,a);j=0;}else{strcpy(p->name,a);j=0;k=0;while(k<31&&(strcmp(p->name,kword[k].name)!=0))/*查找静态表*/k=k+1;if(k==31)/*没找到,为用户定义的标识符*/p->data=10;e
16、lsep->data=kword[k].number;printf("(%d,%s)",p->data,p->name);r->next=p;r=p;}}elseif(ch>='0'&&ch<='9')/*对以数字开头的进行匹配操作*/{a[j]=ch;j++;i++;ch=string[i];f=0;while(ch>='0'&&ch<='9'
17、
18、ch>='a'&&ch<='z'