编译原理(实验三)模拟实现递归下降法

avatar 2018年04月24日10:38:26 0 327 views
一.实验内容 已知文法G[S]: S →(A)|aAb A →eA’|dSA’ A’ →dA’|ε     二.实验要求: 1.给出文法的FIRST集和FOLLOW集。 2.设计相应的例子进行测试,判断输入所给句子是否是合法的句子。   三、我的代码
  1. #include <stdio.h>
  2. /*
  3.  *First(S)={(, a}
  4.  *First(A)={e, d}
  5.  *First(A')={d, ε}
  6.  *Follow(S)={#, d, b, )} First(A') + Follow(A)
  7.  *Follow(A)={b, )}
  8.  *Follow(A')={b, )}     Follow(A)
  9.  */
  10. char str[100];
  11. int length;
  12. int lookhead;
  13. void S();
  14. void A();
  15. void A2();
  16. void error() {
  17.     lookhead == 0;
  18. }
  19. void S()
  20. {
  21.     if(str[lookhead] == '(' || str[lookhead] == 'a')
  22.     {
  23.         lookhead++;
  24.         A();
  25.     }
  26.     else {
  27.         error();
  28.     }
  29. }
  30. void A()
  31. {
  32.     if(str[lookhead] == 'e') {
  33.         lookhead++;
  34.         A2();
  35.     } else if(str[lookhead] = 'd') {
  36.         lookhead++;
  37.         S();
  38.         lookhead++;
  39.         A2();
  40.     } else {
  41.         error();
  42.     }
  43. }
  44. void A2()
  45. {
  46.     if(str[lookhead] == 'd') {
  47.         lookhead++;
  48.         A2();
  49.     } else if(str[lookhead] == ')' || str[lookhead] == 'b'){
  50.         lookhead++;
  51.     }
  52. }
  53. int main()
  54. {
  55.     printf("请输入测试字符串:\n");
  56.     while(1)
  57.     {
  58.         lookhead = 0;
  59.         char c=' ';
  60.         int i = 0;
  61.         while(c!='#' && c!='$')
  62.         {
  63.             scanf("%c", &c);
  64.             str[i++] = c;
  65.         }
  66.         getchar();
  67.         length = i;
  68.         S();
  69.         if(lookhead == length-1) {
  70.             printf("该句子合法\n");
  71.         } else {
  72.             printf("该句子不合法\n");
  73.         }
  74.     }
  75.     return 0;
  76. }
  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
您需要登录才能评论,可以选择注册或者QQ快速登录

     

已通过评论:0   待审核评论数:0