实验一、词法分析实验
实验一、词法分析实验
专业 商软3班 姓名 陈文豪 学号 201506110196
一、实验目的
编制一个词法分析程序
二、实验内容和要求
输入:源程序字符串
输出:二元组(种别,单词符号本身)
三、实验方法、步骤及结果测试
1. 源程序名:压缩包文件(rar或zip)中源程序名词法分析.c,可执行程序名:词法分析.exe
2. 原理分析及流程图
关键过程:把输入的字符串存入数组---从数组中拿出一个字符根据它的ascii码判断出种别---判断完后输出
3. 主要程序段及其解释
1 void cwh() 2 { 3 int i,m;/*m用于记录linshi的下标*/ 4 char *guanjianzi[6]= {"begin","if","then","while","do","end"}; /*char*[]数组每个元素指向一个char型的变量,关键字数组记得zhongbie+1*/ 5 for(i=0; i<15; i++) 6 { 7 linshi[i]=NULL; /*定义一个临时存放字符串的数组用作比较*/ 8 } 9 m=0;/*初始化下标*/ 10 sum=0; 11 ch=zifu[p++]; 12 /*开始识别字符种别*/ 13 while(ch==' ') 14 { 15 ch=zifu[p++]; 16 } 17 /*识别关键字或者标识符*/ 18 if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) 19 { 20 while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))/*将标识符存入临时数组*/ 21 { 22 linshi[m++]=ch; 23 ch=zifu[p++]; 24 } 25 linshi[m]='\0'; 26 p--; 27 zhongbie=10;/*p=p+1下次识别就是p+1*/ 28 for(i=0; i<6; i++) /*将识别出来的字符和已定义的关键字作比较 */ 29 { 30 if(strcmp(linshi,guanjianzi[i])==0) 31 { 32 zhongbie=i+1; 33 break; 34 } 35 } 36 } 37 /*识别数字*/ 38 else if((ch>='0'&&ch<='9')) 39 { 40 while((ch>='0'&&ch<='9')) 41 { 42 linshi[m++]=ch; 43 ch=zifu[p++]; 44 } 45 p--; 46 zhongbie=11; 47 } 48 else 49 { 50 switch(ch) 51 { 52 case ':': 53 linshi[m++]=ch; 54 ch=zifu[p++]; 55 if(ch=='=') 56 { 57 zhongbie=18; 58 linshi[m++]=ch; 59 } 60 else 61 { 62 zhongbie=17; 63 p--; 64 } 65 break; 66 case '<': 67 linshi[m++]=ch; 68 ch=zifu[p++]; 69 if(ch=='=') 70 { 71 zhongbie=21; 72 linshi[m++]=ch; 73 } 74 else if(ch=='>') 75 { 76 zhongbie=22; 77 linshi[m++]=ch; 78 } 79 else 80 { 81 zhongbie=20; 82 p--; 83 } 84 break; 85 case '>': 86 linshi[m++]=ch; 87 ch=zifu[p++]; 88 if(ch=='=') 89 { 90 zhongbie=24; 91 linshi[m++]=ch; 92 } 93 else 94 { 95 zhongbie=23; 96 p--; 97 } 98 break; 99 case '+': 100 zhongbie=13; 101 linshi[0]=ch; 102 break; 103 case '-': 104 zhongbie=14; 105 linshi[0]=ch; 106 break; 107 case '*': 108 zhongbie=15; 109 linshi[0]=ch; 110 break; 111 case '/': 112 zhongbie=16; 113 linshi[0]=ch; 114 break; 115 case '=': 116 zhongbie=25; 117 linshi[0]=ch; 118 break; 119 case ';': 120 zhongbie=26; 121 linshi[0]=ch; 122 break; 123 case '(': 124 zhongbie=27; 125 linshi[0]=ch; 126 break; 127 case ')': 128 zhongbie=28; 129 linshi[0]=ch; 130 break; 131 case '#': 132 zhongbie=0; 133 linshi[0]=ch; 134 break; 135 case'\n': 136 zhongbie=-2; 137 break; 138 default: 139 zhongbie=-1; 140 break; 141 } 142 } 143 }
4. 运行结果及分析
四、实验总结
这是编译原理的第一次实验报告作业,刚开始做比较困难,因为没写过这类型的程序,后来上网查了些资料后才逐渐有了整体的思路,并最终完成程序。
过程中有些小细节的处理不够细腻导致最终程序出现错误,在不断的处理这些错误的过程进一步巩固了自己的学到的知识。
心得:学会了使用全局变量处理问题
实验问题:1.关键字不知道怎么整理成一个数组
2.字符如何判断是关键字还是标识符
解决方案:1.使用指针数组char *guanjianzi[6]
2.用strcmp(临时存放字符的数组,guanjianzi[])==0得出是关键字还是标识符