当前位置:   article > 正文

编译原理——实验1 词法分析程序设计_4.1:待分析的简单语言的词法 (1)关键字: begin if then while do end

4.1:待分析的简单语言的词法 (1)关键字: begin if then while do end 所有的关键

实验1 词法分析程序设计

【实验要求】

1、待分析的简单语言的词法

1) 关键字

begin if then while do end

2) 运算符和界符

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

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

ID=letter(letter|digit)*

NUM=digitdigit*

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

 

2、各种单词符号对应的种别编码

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

<

20

while

4

<>

21

do

5

<=

22

end

6

>

23

letter(letter|digit)*

10

>=

24

digitdigit*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

 

3、词法分析程序的功能

输入:所给文法的源程序字符串

输出:二元组(syn,token或sum)构成的序列。

syn为单词种别码;

token为存放的单词自身字符串;

sum为整形常数。

例如:对源程序begin x:=9;if x>0 then x:=2*x+1/3;end# 经词法分析后输出如下序列:

(1,begin)(10,’x’) (18,:=) (11,9) (26,;) (2,if)……

 

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. char prog[800]; //存储程序
  5. char token[10]; //存储单词字符串
  6. char ch; //当前字符
  7. int syn; //单词种别码
  8. int sum; //整型常数
  9. int p; //prog指针
  10. int m; //token指针
  11. int n;
  12. //关键字
  13. const char * rwtab[6] = {"begin", "if", "then", "while", "do", "end"};
  14. bool isLetter(char ch); //判断是否为字母
  15. bool isDigit(char ch); //判断是否为数字
  16. void scanner(); //扫描分析器
  17. bool isLetter(char ch){
  18. if ((ch <= 'z' && ch >='a') || (ch <'Z' && ch >= 'A')){
  19. return true;
  20. }
  21. else{
  22. return false;
  23. }
  24. }
  25. bool isDigit(char ch){
  26. if(ch >= '0' && ch <= '9'){
  27. return true;
  28. }
  29. else{
  30. return false;
  31. }
  32. }
  33. void scanner(){
  34. //清空token
  35. for (n = 0 ; n < 8; n++){
  36. token[n] = NULL;
  37. }
  38. m = 0;
  39. //获取下一个有效字符
  40. ch = prog[p];
  41. while(ch == ' '){
  42. p++;
  43. ch = prog[p];
  44. }
  45. if(isDigit(ch)){
  46. //字符为数字
  47. sum = 0;
  48. while (isDigit(ch)){
  49. sum = sum * 10 + ch - '0'; //str转换为数值类型
  50. p++;
  51. ch = prog[p];
  52. syn = 11;
  53. }
  54. }
  55. //字符为字符串
  56. else if(isLetter(ch)){
  57. while(isDigit(ch) || isLetter(ch)){
  58. token[m] = ch;
  59. m++;
  60. p++;
  61. ch = prog[p];
  62. }
  63. token[m] = '\0';
  64. m++;
  65. syn = 10;
  66. for(n = 0; n < 6; n++){
  67. if(strcmp(token, rwtab[n]) == 0){
  68. syn = n + 1;
  69. break;
  70. }
  71. }
  72. }
  73. else{
  74. switch (ch){
  75. case '<':
  76. syn = 20;
  77. m = 0;
  78. token[m] = ch;
  79. m++;
  80. p++;
  81. ch = prog[p];
  82. if (ch == '>') {
  83. syn = 21;
  84. token[m] = ch;
  85. m++;
  86. p++;
  87. ch = prog[p];
  88. }
  89. else if (ch == '=') {
  90. syn = 22;
  91. token[m++] = ch;
  92. m++;
  93. p++;
  94. ch = prog[p];
  95. }
  96. break;
  97. case '>':
  98. syn = 23;
  99. m = 0;
  100. token[m++] = ch;
  101. p++;
  102. ch = prog[p];
  103. if (ch == '=') {
  104. syn = 24;
  105. token[m] = ch;
  106. m++;
  107. p++;
  108. ch = prog[p];
  109. }
  110. break;
  111. case ':':
  112. syn = 17;
  113. m = 0;
  114. token[m] = ch;
  115. m++;
  116. p++;
  117. ch = prog[p];
  118. if (ch == '=') {
  119. syn = 18;
  120. token[m] = ch;
  121. m++;
  122. p++;
  123. ch = prog[p];
  124. }
  125. break;
  126. case '+':
  127. syn = 13;
  128. token[0] = ch;
  129. p++;
  130. ch = prog[p];
  131. break;
  132. case '-':
  133. syn = 14;
  134. token[0] = ch;
  135. p++;
  136. ch = prog[p];
  137. break;
  138. case '*':
  139. syn = 15;
  140. token[0] = ch;
  141. p++;
  142. ch = prog[p];
  143. break;
  144. case '/':
  145. syn = 16;
  146. token[0] = ch;
  147. p++;
  148. ch = prog[p];
  149. break;
  150. case '=':
  151. syn = 25;
  152. token[0] = ch;
  153. p++;
  154. ch = prog[p];
  155. break;
  156. case ';':
  157. syn = 26;
  158. token[0] = ch;
  159. p++;
  160. ch = prog[p];
  161. break;
  162. case '(':
  163. syn = 27;
  164. token[0] = ch;
  165. p++;
  166. ch = prog[p];
  167. break;
  168. case ')':
  169. syn = 28;
  170. token[0] = ch;
  171. p++;
  172. ch = prog[p];
  173. break;
  174. case '#':
  175. syn = 0;
  176. token[0] = ch;
  177. break;
  178. default:
  179. syn = -1;
  180. break;
  181. }
  182. }
  183. }
  184. int main(int argc, char** argv) {
  185. cout << "please input string: \n" << endl;
  186. p = 0;
  187. char str;
  188. //获取程序
  189. do{
  190. str = getchar();
  191. prog[p] = str;
  192. p++;
  193. }while(str != '#');
  194. p = 0;
  195. ch = prog[p];
  196. //开始分析
  197. do{
  198. scanner();
  199. switch(syn){
  200. case 11:
  201. cout << "(" << syn << "," << sum << ")" << endl;
  202. break;
  203. case -1:
  204. cout << "error" << endl;
  205. break;
  206. default:
  207. cout << "("<< syn << "," << token << ")" <<endl;
  208. }
  209. }while(syn != 0);
  210. system("pause");
  211. return 0;
  212. }

气人的编译器!!!

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

闽ICP备14008679号