商软一班 刘畅 201506110126
一、 实验目的
通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。
二、 实验内容和要求
在原程序中输入源代码
- 对字符串表示的源程序
- 从左到右进行扫描和分解
- 根据词法规则
- 识别出一个一个具有独立意义的单词符号
- 以供语法分析之用
- 发现词法错误,则返回出错信息
在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。
- 识别关键字:main if int for while do return break continue,该类的单词码为1.
- 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
- 运算符:+、-、*、/、=、>、<、>=、<=、!=
- 分隔符:,、;、{、}、(、)
- 常数,如123,4587
各种单词符号对应的种别码。
输出形式:
- 二元式
– (单词种别,单词自身的值)
- 单词种别,表明单词的种类,语法分析需要的重要信息
– 整数码
- 关键字、运算符、界符:一符一码
- 标识符:10, 常数:11
- 单词自身的值
– 标识符token、常数sum
– 关键字、运算符、界符token
一、 实验方法、步骤及结果测试
- 源程序名:词法分析.c 词法分析.exe
可执行程序名:编译原理 实验报告.exe
- 原理分析及流程图
- 主要程序段及其解释:实现主要功能的程序段,重要的是程序的注释解释。
1 #include <stdio.h> 2 #include <string.h> 3 4 char string[80],simbol[8],ch; 5 int wordID,index,m,n,sum; 6 char *rwtab[6]={"begin","if","then","while","do","end"}; 7 8 void scaner(void); 9 10 main() 11 { 12 int index=0; 13 // printf("\n lease inindexut a string(end with '#'):\n"); 14 printf("Please input string (end#):"); 15 16 do{ 17 scanf("%c",&ch); 18 string[index++]=ch; 19 }while(ch!='#'); 20 21 index=0; 22 do{ 23 scaner(); 24 switch(wordID) 25 { 26 case 11: 27 printf("( %-10d%5d )\n",sum,wordID); 28 break; 29 30 case -1: 31 printf("you have inindexut a wrong string\n"); 32 //getch(); 33 return 0; 34 break; 35 36 default: 37 printf("( %-10s%5d )\n",simbol,wordID); 38 break; 39 } 40 }while(wordID!=0); 41 //getch(); 42 return 0; 43 } 44 45 void scaner(void) 46 { 47 sum=0; 48 49 for(m=0;m<8;m++) 50 simbol[m++]= NULL; 51 52 ch=string[index++]; 53 m=0; 54 55 while((ch==' ')||(ch=='\n')) 56 ch=string[index++]; 57 58 if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))) 59 { 60 while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))) 61 { 62 simbol[m++]=ch; 63 ch=string[index++]; 64 } 65 66 index--; 67 wordID=10; 68 69 for(n=0;n<6;n++) 70 if(strcmp(simbol,rwtab[n])==0) 71 { 72 wordID=n+1; 73 break; 74 } 75 } 76 else if((ch>='0')&&(ch<='9')) 77 { 78 while((ch>='0')&&(ch<='9')) 79 { 80 sum=sum*10+ch-'0'; 81 ch=string[index++]; 82 } 83 index--; 84 wordID=11; 85 } 86 else 87 { 88 switch(ch) 89 { 90 case '<': 91 simbol[m++]=ch; 92 ch=string[index++]; 93 if(ch=='=') 94 { 95 wordID=22; 96 simbol[m++]=ch; 97 } 98 else 99 { 100 wordID=20; 101 index--; 102 } 103 break; 104 105 case '>': 106 simbol[m++]=ch; 107 ch=string[index++]; 108 if(ch=='=') 109 { 110 wordID=24; 111 simbol[m++]=ch; 112 } 113 else 114 { 115 wordID=23; 116 index--; 117 } 118 break; 119 120 case '+': 121 simbol[m++]=ch; 122 ch=string[index++]; 123 if(ch=='+') 124 { 125 wordID=17; 126 simbol[m++]=ch; 127 } 128 else 129 { 130 wordID=13; 131 index--; 132 } 133 break; 134 135 case '-': 136 simbol[m++]=ch; 137 ch=string[index++]; 138 if(ch=='-') 139 { 140 wordID=29; 141 simbol[m++]=ch; 142 } 143 else 144 { 145 wordID=14; 146 index--; 147 } 148 break; 149 150 case '!': 151 ch=string[index++]; 152 if(ch=='=') 153 { 154 wordID=21; 155 simbol[m++]=ch; 156 } 157 else 158 { 159 wordID=31; 160 index--; 161 } 162 break; 163 164 case '=': 165 simbol[m++]=ch; 166 ch=string[index++]; 167 if(ch=='=') 168 { 169 wordID=25; 170 simbol[m++]=ch; 171 } 172 else 173 { 174 wordID=18; 175 index--; 176 } 177 break; 178 179 case '*': 180 wordID=15; 181 simbol[m++]=ch; 182 break; 183 184 case '/': 185 wordID=16; 186 simbol[m++]=ch; 187 break; 188 189 case '(': 190 wordID=27; 191 simbol[m++]=ch; 192 break; 193 194 case ')': 195 wordID=28; 196 simbol[m++]=ch; 197 break; 198 199 case '{': 200 wordID=5; 201 simbol[m++]=ch; 202 break; 203 204 case '}': 205 wordID=6; 206 simbol[m++]=ch; 207 break; 208 209 case ';': 210 wordID=26; 211 simbol[m++]=ch; 212 break; 213 214 case '\"': 215 wordID=30; 216 simbol[m++]=ch; 217 break; 218 219 case '#': 220 wordID=0; 221 simbol[m++]=ch; 222 break; 223 224 case ':': 225 wordID=17; 226 simbol[m++]=ch; 227 break; 228 229 default: 230 wordID=-1; 231 break; 232 } 233 } 234 simbol[m++]='\0'; 235 }
- 运行结果及分析
输入源代码:begin x:2; end#
符合个字符的单词码
实验总结
学会编写一个简单的词法分析程序,利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来.