编译原理实验(一)——词法分析

不念不忘少年蓝@ 2023-05-30 09:15 152阅读 0赞

编译原理实验(一)——词法分析

      • 实验要求
      • 参考程序
      • 运行截图

实验要求

输入为字符串(或待进行词法分析的源程序),输出为单词串,即由(单词,类别)所组成的二元组序列;

参考程序

  1. #include <string>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <set>
  5. using namespace std;
  6. const int maxLineNum = 100;
  7. set<string> key; //关键字
  8. char ch; //当前读取字符
  9. int col, maxcol; // col 读取当前行位置,当前行最大长度
  10. ifstream readfile; //文件输入流
  11. char line[maxLineNum]; //读取文件一行
  12. char identifier[maxLineNum]; //保留读取标识符或者关键字
  13. void init(); //进行初始化工作
  14. int getsym(); //进行词法分析
  15. int getch(); //读取一个字符
  16. int main()
  17. {
  18. cout << "请输入要分析的文件名(请放在该程序同一目录): ";
  19. string filename = "";
  20. cin>>filename;
  21. readfile.open(filename);
  22. if (readfile.is_open() == false)
  23. {
  24. cout << "文件不存在";
  25. return 0;
  26. }
  27. init();
  28. col = maxcol = 0;
  29. ch = ' ';
  30. while (getsym())
  31. ;
  32. return 0;
  33. }
  34. void init()
  35. {
  36. key.insert("const");
  37. key.insert("do");
  38. key.insert("while");
  39. key.insert("if");
  40. key.insert("else");
  41. key.insert("for");
  42. key.insert("int");
  43. key.insert("char");
  44. key.insert("return");
  45. key.insert("void");
  46. key.insert("read");
  47. key.insert("write");
  48. }
  49. int getch()
  50. {
  51. if (col == maxcol)
  52. {
  53. if (readfile.peek() == EOF)
  54. {
  55. return -1;
  56. }
  57. maxcol = col = 0;
  58. ch = ' ';
  59. while (ch != '\n')
  60. {
  61. if (readfile.peek() == EOF)
  62. {
  63. line[maxcol] = 0;
  64. break;
  65. }
  66. readfile.get(ch);
  67. line[maxcol++] = ch;
  68. }
  69. }
  70. ch = line[col++];
  71. return 0;
  72. }
  73. int getsym()
  74. {
  75. int i, j, k, num;
  76. while (ch == ' ' || ch == 10 || ch == 13 || ch == 9)
  77. {
  78. if (getch() == -1)
  79. return 0;
  80. }
  81. if (isalpha(ch))
  82. {
  83. k = 0;
  84. while (isalpha(ch) || isdigit(ch))
  85. {
  86. identifier[k] = ch;
  87. k++;
  88. if (getch() == -1)
  89. return 0;
  90. }
  91. identifier[k] = 0;
  92. if (key.find(string(identifier)) == key.end())
  93. {
  94. cout << "标识符 (3 , '" << identifier << "')\n";
  95. }
  96. else
  97. {
  98. cout << "关键字 (1 , '" << identifier << "')\n";
  99. }
  100. }
  101. else
  102. {
  103. if (isdigit(ch))
  104. {
  105. k = num = 0;
  106. while (isdigit(ch))
  107. {
  108. num = num * 10 + ch - '0';
  109. k++;
  110. if (getch() == -1)
  111. return 0;
  112. }
  113. if(isalpha(ch)||ch=='_'){
  114. cout<<"非法标识符 (6,'"<<num<<ch<<"')\n";
  115. }else{
  116. cout << "整数 (2 , '" << num << "')\n";
  117. }
  118. }
  119. else
  120. {
  121. if (ch == '<')
  122. {
  123. if (getch() == -1)
  124. return 0;
  125. if (ch == '=')
  126. {
  127. cout << "运算符 (4 , '<=')\n";
  128. if (getch() == -1)
  129. return 0;
  130. }
  131. else
  132. {
  133. cout << "运算符 (4 , '<')\n";
  134. }
  135. }
  136. else if (ch == '>')
  137. {
  138. if (getch() == -1)
  139. return 0;
  140. if (ch == '=')
  141. {
  142. cout << "运算符 (4 , '>=')\n";
  143. if (getch() == -1)
  144. return 0;
  145. }
  146. else
  147. {
  148. cout << "运算符 (4 , '>')\n";
  149. }
  150. }
  151. else
  152. {
  153. if (ch == '+')
  154. {
  155. cout << "运算符 (4 , '+')\n";
  156. }
  157. else if (ch == '-')
  158. {
  159. cout << "运算符 (4 , '-')\n";
  160. }
  161. else if (ch == '*')
  162. {
  163. cout << "运算符 (4 , '*')\n";
  164. }
  165. else if (ch == '/')
  166. {
  167. cout << "运算符 (4 , '/')\n";
  168. }
  169. else if (ch == '=')
  170. {
  171. cout << "运算符 (4 , '=')\n";
  172. }
  173. else if (ch == '(')
  174. {
  175. cout << "运算符 (4 , '(')\n";
  176. }
  177. else if (ch == ')')
  178. {
  179. cout << "运算符 (4 , ')')\n";
  180. }
  181. else if (ch == '.')
  182. {
  183. cout << "运算符 (4 , '.')\n";
  184. }
  185. else if (ch == ',')
  186. {
  187. cout << "分界符 (5 , ',')\n";
  188. }
  189. else if (ch == ';')
  190. {
  191. cout << "分界符 (5 , ';')\n";
  192. }
  193. else if (ch == '{')
  194. {
  195. cout << "分界符 (5 , '{')\n";
  196. }
  197. else if (ch == '}')
  198. {
  199. cout << "分界符 (5 , '}')\n";
  200. }
  201. else
  202. {
  203. cout << ch << " error!请检查代码是否拼写正确!";
  204. return 0;
  205. }
  206. if (getch() == -1)
  207. return 0;
  208. }
  209. }
  210. }
  211. return 1;
  212. }

运行截图

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,152人围观)

还没有评论,来说两句吧...

相关阅读