实验一、词法分析实验
专业 姓名 学号
一、 实验目的
编制一个词法分析程序
二、 实验内容和要求
输入:源程序字符串
输出:二元组(种码,单词符号本身)。
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中源程序名cifafenxiqi.c
可执行程序名:cifafenxi.exe
- 2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
- 3. 主要程序段及其解释:
- 4. #include <stdio.h>
- 5. #include <string.h>
- 6.
- 7. char prog[80],token[8],ch; //创建字符数组
- 8. int syn,p,m,n,sum; //syn 是种码
- 9. char *rwtab[6]={"begin","if","then","while","do","end"}; //字符数组’关键字’
- 10.
11. void scaner(void);
- 12.
13. main()
14. {
- 15. p=0;
- 16. printf("\n please input a string(end with ‘#‘):\n"); //’#’字符为结束标志
- 17. // 输入 用prog字符数组存储
- 18. do{
- 19. scanf("%c",&ch);
- 20. prog[p++]=ch;
- 21. }while(ch!=‘#‘);
- 22.
- 23. p=0; //prog数组 从头开始 行数53
- 24. do{
- 25. scaner(); //将输入的源程序分类别
- 26. switch(syn)
- 27. {
- 28. case 11:
- 29. printf("( %-10d%5d )\n",sum,syn);
- 30. break;
- 31.
- 32. case -1:
- 33. printf("you have input a wrong string\n");
- 34. //getch();
- 35. return 0;
- 36. break;
- 37.
- 38. default:
- 39. printf("( %-10s%5d )\n",token,syn);
- 40. break;
- 41. }
- 42. }while(syn!=0);
- 43. //getch();
- 44. }
- 45.
46. void scaner(void)
47. {
- 48. sum=0;
- 49.
- 50. for(m=0;m<8;m++)
- 51. token[m++]= NULL; //初始化
- 52.
- 53. ch=prog[p++]; //调出prog字符数组的字符
- 54. m=0;
- 55.
- 56. while((ch==‘ ‘)||(ch==‘\n‘))
- 57. ch=prog[p++]; //将回车、空格忽略
- 58.
- 59. if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))) //判断是否为字母
- 60. {
- 61. while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
- 62. {
- 63. token[m++]=ch; //存储字母到token字符数组中
- 64. ch=prog[p++];
- 65. }
- 66.
- 67. p--; //否,退回一格
- 68. syn=10; //输出
- 69.
- 70. for(n=0;n<6;n++)
- 71. if(strcmp(token,rwtab[n])==0) //判断是否万为关键字
- 72. {
- 73. syn=n+1;
- 74. break;
- 75. }
- 76. }
- 77. else if((ch>=‘0‘)&&(ch<=‘9‘)) //判断是否为数字
- 78. {
- 79. while((ch>=‘0‘)&&(ch<=‘9‘))
- 80. {
- 81. sum=sum*10+ch-‘0‘;
- 82. ch=prog[p++];
- 83. }
- 84. p--;
- 85. syn=11;
- 86. }
- 87. else //界符、运算符、其他特殊符号
- 88. {
- 89. switch(ch)
- 90. {
- 91. case ‘<‘:
- 92. token[m++]=ch;
- 93. ch=prog[p++];
- 94. if(ch==‘=‘) //判断是〈还是<=
- 95. {
- 96. syn=22;
- 97. token[m++]=ch;
- 98. }
- 99. else
- 100. {
- 101. syn=20;
- 102. p--;
- 103. }
- 104. break;
- 105.
- 106. case ‘>‘:
- 107. token[m++]=ch;
- 108. ch=prog[p++];
- 109. if(ch==‘=‘)
- 110. {
- 111. syn=24;
- 112. token[m++]=ch;
- 113. }
- 114. else
- 115. {
- 116. syn=23;
- 117. p--;
- 118. }
- 119. break;
- 120.
- 121. case ‘+‘:
- 122. token[m++]=ch;
- 123. ch=prog[p++];
- 124. if(ch==‘+‘)
- 125. {
- 126. syn=17;
- 127. token[m++]=ch;
- 128. }
- 129. else
- 130. {
- 131. syn=13;
- 132. p--;
- 133. }
- 134. break;
- 135.
- 136. case ‘-‘:
- 137. token[m++]=ch;
- 138. ch=prog[p++];
- 139. if(ch==‘-‘)
- 140. {
- 141. syn=29;
- 142. token[m++]=ch;
- 143. }
- 144. else
- 145. {
- 146. syn=14;
- 147. p--;
- 148. }
- 149. break;
- 150.
- 151. case ‘!‘:
- 152. ch=prog[p++];
- 153. if(ch==‘=‘)
- 154. {
- 155. syn=21;
- 156. token[m++]=ch;
- 157. }
- 158. else
- 159. {
- 160. syn=31;
- 161. p--;
- 162. }
- 163. break;
- 164.
- 165. case ‘=‘:
- 166. token[m++]=ch;
- 167. ch=prog[p++];
- 168. if(ch==‘=‘)
- 169. {
- 170. syn=25;
- 171. token[m++]=ch;
- 172. }
- 173. else
- 174. {
- 175. syn=18;
- 176. p--;
- 177. }
- 178. break;
- 179.
- 180. case ‘*‘:
- 181. syn=15;
- 182. token[m++]=ch;
- 183. break;
- 184.
- 185. case ‘/‘:
- 186. syn=16;
- 187. token[m++]=ch;
- 188. break;
- 189.
- 190. case ‘(‘:
- 191. syn=27;
- 192. token[m++]=ch;
- 193. break;
- 194.
- 195. case ‘)‘:
- 196. syn=28;
- 197. token[m++]=ch;
- 198. break;
- 199.
- 200. case ‘{‘:
- 201. syn=5;
- 202. token[m++]=ch;
- 203. break;
- 204.
- 205. case ‘}‘:
- 206. syn=6;
- 207. token[m++]=ch;
- 208. break;
- 209.
- 210. case ‘;‘:
- 211. syn=26;
- 212. token[m++]=ch;
- 213. break;
- 214.
- 215. case ‘\"‘:
- 216. syn=30;
- 217. token[m++]=ch;
- 218. break;
- 219.
- 220. case ‘#‘:
- 221. syn=0;
- 222. token[m++]=ch;
- 223. break;
- 224.
- 225. case ‘:‘:
- 226. syn=17;
- 227. token[m++]=ch;
- 228. break;
- 229.
- 230. default:
- 231. syn=-1;
- 232. break;
- 233. }
- 234. }
- 235. token[m++]=‘\0‘;
- 236. }
- 237.
- 238. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
四、 实验总结
心得体会,实验过程的难点问题及其解决的方法。
刚刚接触词法分析,有很不懂得地方,程序还不是完善,只是一个简简单单的词法分析器,还有很多地方要学习。
词法分析作业
原文:http://www.cnblogs.com/dami666/p/5947547.html