当前位置:   article > 正文

编译原理——词法分析器(C/C++代码实现)_词法分析器代码

词法分析器代码

目录

0 实验目的:

1 实验要求:

2 实验内容:

3 实验思路:

4 实验代码:

5 实验结果:

6 实验总结:

7 实验程序以及实验报告下载链接:


0 实验目的:

设计、编制、实现并调试一个词法分析器,加深对词法分析的理解。


1 实验要求:

根据编译原理理论课所讲授的“单词的转换图”。如下图,编写识别单词的词法分析器,控制台输出识别出的每个单词。


2 实验内容:

1.待分析的简单的词法:

(1).关键字:

begin if then while do end 等等;

(2).运算法和界符:

:= + - * / < <= <> > >= = ; ( ) #

(3).其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:

ID = letter(letter|digit)*

NUM = digit digit*

(4).空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段常被忽略。

2.各种单词符号对应的种别码:

各种单词符号对应的种别码
单词符号种别码单词符号种别码
begin117
if2:=18
then3<20
while4<>21
do5<=22
end6>23
letter(letter|digit)*10>=24
digit digit*11=25
+13;26
-14(27
*15)28
/16#

0

3.词法分析器的功能:
输入:所给文法的源程序字符串。
输出:二元组(syn,token,sum)构成的序列。
其中:syn为单词种别码;
           token为存放的单词自身字符串;
           sum为整型常数。
例如:对源程序begin a:=9 if a>b then x:=2*a+1/3; end的源文件,经过词法分析后输出如下序列:
(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)......

3 实验思路:

  1. 首先我们应该确认待分析的五类简单的单词字符(关键字,标识符,常数,运算符,界符)。同时,我们也要知道单词符号的种类值。
  2. 将整个程序分成五个部分:判断关键字函数,判断字母函数,判断数字函数,核心子程序(语法分析程序),主函数。
  3. 设一个token数组,接收控制台输入字符流,并送给语法分析程序。同时,设置一个存放关键字key的数组。语法分析程序读取每个字符并进行判断(字母或者下划线,符号,数字)
    (1).如果是字母或者下划线,读取字符,直到下一个字符不是字母、下划线或者数字,将这一串字符保存到数组。进而与关键字数组比较,确定是关键字还是标识符。
    (2).如果是数字,读取字符直到不是数字。
    (3).如果是运算符或者界符,读取字符,并超前读取一位字符,先确定没有争议的字符,接着判断有争议的字符,如果判断异常,则输出对应的返回值。
  4. 主函数调用核心子程序(语法分析程序),并按照(种别码,单词字符)的形式输出,结束程序。

4 实验代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int isDigit();
  4. int isAlpha();
  5. int isKey();
  6. void scan(int &attr, int &i, char s[],int &n);
  7. char iskey[6][50] = {"if", "then", "begin", "while", "do", "end"};
  8. char token[50];
  9. //主函数
  10. int main()
  11. {
  12. char s[100];
  13. printf("请输入字符串(以#结尾)\n");
  14. int flag=0;
  15. while (scanf("%s", s))
  16. {
  17. if(strcmp(s, "#") == 0)
  18. break;
  19. int i = 0;
  20. int n=1;
  21. int attr;
  22. if(flag==0)
  23. {
  24. printf("(种别码,单词属性)\n");
  25. flag=1;
  26. }
  27. while (i <strlen(s))
  28. {
  29. scan(attr, i, s,n);
  30. if(n==1)
  31. printf("(%d,%s)\n", attr, token);
  32. }
  33. }
  34. return 0;
  35. }
  36. int isAlpha(char ch)//判断是不是字母
  37. {
  38. if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
  39. return 1;
  40. else
  41. return 0;
  42. }
  43. int isKey(char s[])//判断关键字
  44. {
  45. for (int i = 0; i < 6; i++)
  46. {
  47. if (strcmp(s, iskey[i]) == 0)
  48. {
  49. return i + 1;
  50. }
  51. }
  52. return -1;
  53. }
  54. int isDigit(char ch)//判断是不是数字
  55. {
  56. if (ch >= '0' && ch <= '9')
  57. return 1;
  58. else
  59. return 0;
  60. }
  61. void scan(int &attr, int &i, char s[],int &n)//核心子程序(语法分析程序)
  62. {
  63. int temp = 0;
  64. if (s[i] == ' ')
  65. i++;
  66. if (isAlpha(s[i]))//开头是字母
  67. {
  68. while (isDigit(s[i]) || isAlpha(s[i]))
  69. {
  70. token[temp++] = s[i];
  71. i++;
  72. }
  73. token[temp] = '\0';
  74. attr = isKey(token);
  75. if (attr == -1)
  76. {
  77. attr = 10;
  78. }
  79. }
  80. else if (isDigit(s[i]))//开头是数字
  81. {
  82. while (isDigit(s[i]))
  83. {
  84. token[temp++] = s[i];
  85. i++;
  86. }
  87. token[temp] = '\0';
  88. attr = 11;
  89. }
  90. else//如果是运算符或者界符
  91. {
  92. switch (s[i])
  93. {
  94. case '+':
  95. attr = 13;
  96. token[0] = s[i];
  97. token[1] = '\0';
  98. break;
  99. case '-':
  100. attr = 14;
  101. token[0] = s[i];
  102. token[1] = '\0';
  103. break;
  104. case '*':
  105. attr = 15;
  106. token[0] = s[i];
  107. token[1] = '\0';
  108. break;
  109. case '/':
  110. attr = 16;
  111. token[0] = s[i];
  112. token[1] = '\0';
  113. break;
  114. case '=':
  115. attr = 25;
  116. token[0] = s[i];
  117. token[1] = '\0';
  118. break;
  119. case ';':
  120. attr = 26;
  121. token[0] = s[i];
  122. token[1] = '\0';
  123. break;
  124. case '(':
  125. attr = 27;
  126. token[0] = s[i];
  127. token[1] = '\0';
  128. break;
  129. case ')':
  130. attr = 28;
  131. token[0] = s[i];
  132. token[1] = '\0';
  133. break;
  134. case '#':
  135. attr = 0;
  136. token[0] = s[i];
  137. token[1] = '\0';
  138. break;
  139. }
  140. if (s[i] == ':')
  141. {
  142. token[temp++] = s[i];
  143. if (s[i + 1] == '=')
  144. {
  145. i++;
  146. token[temp++] = s[i];
  147. attr = 18;
  148. }
  149. else
  150. {
  151. attr = 17;
  152. }
  153. token[temp] = '\0';
  154. }
  155. if (s[i] == '<')
  156. {
  157. token[temp++] = s[i];
  158. if (s[i + 1] == '>')
  159. {
  160. i++;
  161. token[temp++] = s[i];
  162. attr = 21;
  163. }
  164. else if (s[i + 1] == '=')
  165. {
  166. i++;
  167. token[temp++] = s[i];
  168. attr = 22;
  169. }
  170. else
  171. {
  172. attr = 20;
  173. }
  174. token[temp] = '\0';
  175. }
  176. if (s[i] == '>')
  177. {
  178. token[temp++] = s[i];
  179. if (s[i + 1] == '=')
  180. {
  181. i++;
  182. token[temp++] = s[i];
  183. attr = 24;
  184. }
  185. else
  186. {
  187. attr = 23;
  188. }
  189. token[temp] = '\0';
  190. }
  191. i++;
  192. }
  193. }

5 实验结果:


6 实验总结:

这个实验的要求不一样,如果你需要的不是这个,你可以稍微改一下,需要探讨的话可以与我私信。 

7 实验程序以及实验报告下载链接:

编译原理实验:包括实验一词法分析器,实验二进制分析,实验三语法分析器,实验四SLR语法分析器等其中含有实验报告,实验代码等等-C++文档类资源-CSDN文库icon-default.png?t=MBR7https://download.csdn.net/download/qq_58773908/87356376

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/294217
推荐阅读
相关标签
  

闽ICP备14008679号