编译原理PL0语法分析实验1

朱雀 2023-10-01 08:52 165阅读 0赞

语法分析程序与词法分析程序共同点

语法分析程序又叫下推自动机,词法分析程序又叫有穷自动机。

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

相同点:都是分析种别码

不同点:词法分析器分析的是字符串中的单词的种别码(单词)

语法分析器分析的是字符串的文法是否正确(句子)

待分析的简单语言的语法

BNF:(1)<程序>::=begin<语句串>end

(2)<语句串>::=<语句>{;<语句>}

(3)<语句>::=<赋值语句>

(4)<赋值语句>::=ID:=<表达式>

(5)<表达式>::=<项>{+<项>|-<项>}

(6)<项>::=<因子{*<因子>|/<因子>}

语法分析程序的功能

输入一个c语言的字符串,以#号结束,如果是文法正确的句子,那么程序就会输出成功信息;如果是文法错误的句子,那么程序就会输出错误的信息以及提示出错点在哪里

正确的文法:begin BNF文法 end#

【例1】

给定一个字符串,判断语法是否正确:

输入:begin a:=9;x:=2*3;b:=a+x end#

输出:成功!

输入:begin x:=a+b*c end

输出:错误!“end”后出错了

输入:begin x:=a+b*c

输出:错误!缺少“end”

输入:x:=a+b*c end#

输出:错误!缺少begin

程序验证代码(语法分析程序)

  1. #include <studio.h>
  2. #include <string.h>
  3. void scaner();
  4. void sentence();
  5. void statement();
  6. void expression();
  7. void term();
  8. void factor();
  9. char *key[0]={"begin","if","then","while","do","end"},ch[100];
  10. int p=0kk=0,q,syn;
  11. int main()
  12. {
  13. printf("输入:\n");
  14. gets(ch);
  15. sentence();
  16. return 0;
  17. }
  18. void scanner()
  19. {
  20. char token[100] = {};
  21. q = 0;
  22. while(ch[p] == ' ') p++;
  23. if((ch[p] >= 'a' && ch[p] <= 'z')||(ch[p] >= 'A' && ch[p] <= 'Z')
  24. {
  25. token[q++] = ch[p];
  26. p++;
  27. while((ch[p] >= '0' && ch[p] <= '9')||(ch[p] >= 'a' && ch[p] <= 'z')
  28. ||(ch[p] >= 'A' && ch[p] <= 'Z')) token[q++] = ch[p++];
  29. syn = 10;
  30. token[q] = '\0';
  31. for(int n = 0;n < 6;n++)
  32. if(strcmp(token,key[n]) == 0)
  33. {
  34. syn = n + 1;
  35. break;
  36. }
  37. }
  38. else if(ch[p] >= '0' && ch[p] <= '9')
  39. {
  40. token[q++] = ch[p];
  41. p++;
  42. while(ch[p] >= '0' && ch[p] <= '9') token[q++] = ch[p++];
  43. syn = 11;
  44. }
  45. else switch(ch[p])
  46. {
  47. case '<':token[q++] = ch[p++];
  48. if(ch[p] == '>')
  49. {
  50. syn = 21;
  51. token[q++] = ch[p++];
  52. }
  53. else if(ch[p] == '=')
  54. {
  55. syn = 22;
  56. token[q++] = ch[p++];
  57. }
  58. else syn = 23;
  59. break;
  60. case '>':token[q++] = ch[p++];
  61. if(ch[p] == '>')
  62. {
  63. syn = 24;
  64. token[q++] = ch[p++];
  65. }
  66. else syn = 20;
  67. break;
  68. case “:” :token[q++] = ch[p++];
  69. if(ch[p] == "="){
  70. syn = 18;
  71. token[q++] = ch[p++];
  72. }
  73. else syn = 17;
  74. token[q++] = ch[p++];
  75. break;
  76. case '*':syn = 13;
  77. token[q++] = ch[p++];
  78. break;
  79. case '/':syn = 14;
  80. token[q++] = ch[p++];
  81. break;
  82. case '+':syn = 15;
  83. token[q++] = ch[p++];
  84. break;
  85. case '-':syn = 16;
  86. token[q++] = ch[p++];
  87. break;
  88. case '=':syn = 25;
  89. token[q++] = ch[p++];
  90. break;
  91. case ';':syn = 26;
  92. token[q++] = ch[p++];
  93. break;
  94. case '(':syn = 27;
  95. token[q++] = ch[p++];
  96. break;
  97. case ')':syn = 28;
  98. token[q++] = ch[p++];
  99. break;
  100. case '#':syn = 0;
  101. token[q++] = ch[p++];
  102. break;
  103. case '\n':syn = -2;
  104. break;
  105. default:syn = -1;
  106. break;
  107. }
  108. }
  109. void sentence()
  110. {
  111. scaner();
  112. if(syn == 1)
  113. {
  114. statement();
  115. while(syn == 26) statement();
  116. if(syn == 6)
  117. {
  118. scaner();
  119. if(syn == 0) printf("成功!\n");
  120. else printf("错误!“end”后出错。\n");
  121. }
  122. else
  123. {
  124. printf("错误!缺少“end”。\n");
  125. kk = 1;
  126. }
  127. }
  128. else
  129. {
  130. printf("错误!缺少“begin”。\n");
  131. kk = 1;
  132. }
  133. }
  134. void statement()
  135. {
  136. scaner();
  137. if(syn == 10)
  138. {
  139. scaner();
  140. if(syn == 18)
  141. {
  142. scaner();
  143. expression();
  144. }
  145. else
  146. {
  147. printf("错误!“:=”出错。\n");
  148. kk = 1;
  149. }
  150. }
  151. else
  152. {
  153. printf("错误!句子出错。\n");
  154. kk = 1;
  155. }
  156. return;
  157. }
  158. void expression()
  159. {
  160. term();
  161. while((syn == 13)||(syn == 14))
  162. {
  163. scaner();
  164. term();
  165. }
  166. return;
  167. }
  168. void term()
  169. {
  170. factor();
  171. while((syn == 15)||(syn == 16))
  172. {
  173. scaner();
  174. factor();
  175. }
  176. return
  177. }
  178. void factor()
  179. {
  180. if((syn == 10)||(syn == 11)) scaner();
  181. else if(syn == 27)
  182. {
  183. scaner();
  184. expression();
  185. if(syn == 28) scaner();
  186. else
  187. {
  188. printf("错误!“(”出错。\n");
  189. kk = 1;
  190. }
  191. }
  192. else
  193. {
  194. printf("错误!\n");
  195. kk = 1;
  196. }
  197. return
  198. }
  199. //begin a:=9;x:=2*3;b:=a+x end#
  200. //begin x:a+b*c end

运行

输入一个字符串,然后回车,会输出上面例1中的结果

发表评论

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

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

相关阅读

    相关 编译原理PL0语法分析实验1

    语法分析程序与词法分析程序共同点 语法分析程序又叫下推自动机,词法分析程序又叫有穷自动机。 1,待分析的简单语言的词法 相同点:都是分析种别码 不同点:词法分析器分