实验一、词法分析实验
专业:商业软件工程专业 姓名:叶胜轩 学号:201506110125
一、 实验目的
(1) 理解词法分析在编译程序中的作用。
(2) 加深对有穷自动机模型的理解。
(3) 掌握词法分析程序的实现方法。
(4) 用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。
二、 实验内容和要求
1,待分析的简单语言的词法。
2,各种单词符号对应的种别码。
3,词法分析程序的功能(输入,输出)。
三、 实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名:1.c
可执行程序名:1.exe
2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
词法分析主程序示意图
3. 主要程序段及其解释:
#include <stdio.h> #include <string.h> #include <conio.h> #include <ctype.h> char prog[80]={'\0'},token[8]; char ch; int syn,n,sum,m,p; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { m=0; sum=0; for(n=0;n<8;n++) token[n]='\0'; ch=prog[p++]; while(ch==' ') ch=prog[p++]; if(isalpha(ch)) { while(isalpha(ch)||isdigit(ch)) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; ch=prog[p--]; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } else if(isdigit(ch)) { while(isdigit(ch)) { sum=sum*10+ch-'0'; ch=prog[p++]; } ch=prog[p--]; syn=11; } else switch(ch) { case'<':m=0;token[m++]=ch;ch=prog[p++]; if(ch=='>') { syn=21; token[m++]=ch; } else if(ch=='=') { syn=22; token[m++]=ch; } else { syn=20; ch=prog[p--]; } break; case'>':m=0;token[m++]=ch;ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; ch=prog[p--]; } break; case':':m=0;token[m++]=ch;ch=prog[p++]; if(ch=='=') { syn=18; token[m++]=ch; } else { syn=17; ch=prog[p--]; } break; case'+':syn=13;token[0]=ch;break; case'-':syn=14;token[0]=ch;break; case'*':syn=15;token[0]=ch;break; case'/':syn=16;token[0]=ch;break; case'=':syn=25;token[0]=ch;break; case';':syn=26;token[0]=ch;break; case'(':syn=27;token[0]=ch;break; case')':syn=28;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; default:syn=-1; } } main() { p=0; printf("\n请输入需要分析的字符串,以#表示结束:"); do { ch=getchar(); prog[p++]=ch; }while(ch!='#'); p=0; do { scaner(); switch(syn) { case 11: printf("(%d,%d)\n",syn,sum);break; case -1: printf("\n 出错;\n");break; default: printf("(%d,%s)\n",syn,token); } }while(syn!=0); getch(); }
4. 运行结果及分析
四、实验总结
词法分析让我知道我还有很多不会的地方,甚至需要上网查找和问同学,还需认真努力学习。