一、 实验目的
编制一个词法分析程序。
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词符号本身)。
三、 实验方法、步骤及结果测试
1. 源程序名:词法分析.c
可执行程序名:词法分析.exe
2. 原理分析及流程图
3. 主要程序段及其解释:
#include<stdio.h> #include<string.h> #include<stdlib.h> #define Max 1000 int j=1; long g=0; char nchar[Max]={""}; int k=0; char ch=NULL; char m[30]={""}; int sym=-1; main() { char cha; int p; printf("请输入一串字符串:"); while((cha=getchar())!='$') { nchar[g]=cha; g++; } do { p=getsym(); }while(p); } int getsym() { int i; char a[2]={""}; char word[][15]={"begin","do","end","if","then","while"}; int wsym[6]={1,2,3,4,5,6}; int ssym[9]={25,26,27,28,0,13,14,15,16}; char b[9]={'=',';','(',')','#','+','-','*','/'}; if(j==1&&k<g) { ch=nchar[k]; j++; k++; } while(ch==' '||ch==10||ch==9||ch==13) //判断是否为无用字符 { if(k==g) { return 0; } ch=nchar[k]; k++; } if(ch>='a'&&ch<='z') { while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')||ch=='_') { a[0]=ch; strcat(m,a); if(k==g) { break; } ch=nchar[k]; k++; } for(i=0;i<12;i++) { if(strcmp(m,&word[i][0])==0) break; } if(i<12) //判断是否为保留字 { sym=wsym[i]; printf("保留字%s 种别码%d ",m,wsym[i]); } Else //判断是否为标识符 { sym=10; printf("标识符%s 种别码10 ",m); } if(k==g) return 0; strcpy(m,""); return 1; } else if(ch>='0'&&ch<='9') { while(ch>='0'&&ch<='9') //判断是否为数字 { a[0]=ch; strcat(m,a); if(k==g) { break; } ch=nchar[k]; k++; } sym=11; printf("常数%s 种别码11 ",m); if(k==g) //判断是否为运算符 return 0; strcpy(m,""); return 1; } else if(ch==':') { a[0]=ch; strcat(m,a); if(k==g) { sym=17; printf("运算符%s 种别码17 ",m); return 0; } ch=nchar[k]; k++; if(ch=='=') { a[0]=ch; strcat(m,a); sym=18; printf("运算符%s 种别码18 ",m); if(k==g) { return 0; } ch=nchar[k]; k++; } strcpy(m,""); return 1; } else if(ch=='<') { a[0]=ch; strcat(m,a); if(k<g) { ch=nchar[k]; k++; } if(ch=='=') { a[0]=ch; strcat(m,a); sym=21; printf("运算符%s 种别码21 ",m); if(k==g) { return 0; } ch=nchar[k]; k++; } else if(ch=='>') { a[0]=ch; strcat(m,a); sym=22; printf("运算符%s 种别码22 ",m); if(k==g) { return 0; } ch=nchar[k]; k++; } else { printf("运算符%s 种别码22 ",m); } if(k==g) { return 0; } strcpy(m,""); return 1; } else if(ch=='>') { a[0]=ch; strcat(m,a); if(k<g) { ch=nchar[k]; k++; } if(ch=='=') { a[0]=ch; strcat(m,a); sym=24; printf("运算符%s 种别码24 ",m); if(k==g) { return 0; } ch=nchar[k]; k++; } else { sym=23; printf("运算符%s 种别码23 ",m); } if(k==g) { return 0; } strcpy(m,""); return 1; } else { for(i=0;i<9;i++) { if(ch==b[i]) break; } if(i<9) { sym=ssym[i]; a[0]=ch; strcat(m,a); sym=ssym[i]; printf("%s 种别码为:%d ",m,ssym[i]); } else { a[0]=ch; strcat(m,a); sym=-1; printf("错误!%s不存在种别码 ",m); } if(k<g) { ch=nchar[k]; k++; } else { return 0; } strcpy(m,""); return 1; } }
4. 运行结果及分析
四、 实验总结
通过这个实验,使我了解了编译器词法分析的过程。虽然在干开始做着个程序是是很茫然的,但是在经过一段时间的思考,有了感觉和眉目就开始左手写词法分析程序,这个也算是第二版本吧,第一个版本有个问题就是不能呢个让它在用户输入完后再执行分析,而是用户一换行就执行一段并输出结果,然后在让用户输入,这样做感觉不是很满意就对输入进行了改进,这只是一个功能简化的程序,如果以后要增加功能在这个基础上改就好了。