编译原理(实验四)模拟LL实验

avatar 2018年4月24日10:41:53 评论 194 views

一.实验目的:

  1. 能够判一文法是否为LL(1)文法;
  2. 能构造LL(1)语法分析表;
  3. 以程序实现LL(1)的语法分析过程。

 

二.实验内容

已知文法G[S]:
S→MH|a
H→LSo|ε
K→dML|ε
L→eHf
M→K|bLM

 

三.实验要求:

1.给出文法的FIRST集和FOLLOW集(程序实现)。

2.构造该文法的语法分析表。

3.根据语法分析表模拟LL(1)语法分析过程。

3.设计相应的例子进行测试,输入所给句子的语法分析过程。

 

四、我的代码

  1. #include <stdio.h>
  2. /*
  3.  *First(S)={a, b, d, e, ε}
  4.  *First(H)={e, ε}
  5.  *First(K)={d, ε}
  6.  *First(L)={e}
  7.  *First(M)={b, d, ε}
  8.  *Follow(S)={#, o}
  9.  *Follow(H)={#, o, f}
  10.  *Follow(K)={#, e, o}
  11.  *Follow(L)={o, a, b, d, e}
  12.  *Follow(M)={#, e, o}
  13.  */
  14. char str[100];
  15. int length;
  16. int count;
  17. char stack[100];
  18. int top;
  19. void error() {
  20.     printf("\t\t不接受!\n");
  21. }
  22. int matcher() {
  23.     switch(stack[top-1]) {
  24.         case 'S':
  25.             if(str[count] == 'b' || str[count] == 'd' ||
  26.                     str[count] == 'e' || str[count] == 'o' ||
  27.                     str[count] == '#') {
  28.                 top--;
  29.                 stack[top++] = 'H';
  30.                 stack[top++] = 'M';
  31.                 printf("\t\tS->MH\n");
  32.             } else if(str[count] == 'a') {
  33.                 top--;
  34.                 stack[top++] = 'a';
  35.                 printf("\t\tS->a\n");
  36.             } else {
  37.                 return -1;
  38.             }
  39.             break;
  40.         case 'H':
  41.             if(str[count] == 'f' || str[count] == 'o' ||
  42.                     str[count] == '#') {
  43.                 top--;
  44.                 printf("\t\tH->ε\n");
  45.             } else if(str[count] == 'e') {
  46.                 top--;
  47.                 stack[top++] = 'o';
  48.                 stack[top++] = 'S';
  49.                 stack[top++] = 'L';
  50.                 printf("\t\tH->LSo\n");
  51.             } else {
  52.                 return -1;
  53.             }
  54.             break;
  55.         case 'K':
  56.             if(str[count] == 'e' || str[count] == 'o' || str[count] == '#') {
  57.                 top--;
  58.                 printf("\t\tK->ε\n");
  59.             } else if(str[count] == 'd') {
  60.                 top--;
  61.                 stack[top++] = 'L';
  62.                 stack[top++] = 'M';
  63.                 stack[top++] = 'd';
  64.                 printf("\t\tK->dML\n");
  65.             } else {
  66.                 return -1;
  67.             }
  68.             break;
  69.         case 'L':
  70.             if(str[count] == 'e') {
  71.                 top--;
  72.                 stack[top++] = 'f';
  73.                 stack[top++] = 'H';
  74.                 stack[top++] = 'e';
  75.                 printf("\t\tL->eHf\n");
  76.             } else {
  77.                 return -1;
  78.             }
  79.             break;
  80.         case 'M':
  81.             if(str[count] == 'd' || str[count] == 'e' || str[count] == 'o' || str[count] == '#') {
  82.                 top--;
  83.                 stack[top++] = 'K';
  84.                 printf("\t\tM->K\n");
  85.             } else if(str[count] == 'b') {
  86.                 top--;
  87.                 stack[top++] = 'M';
  88.                 stack[top++] = 'L';
  89.                 stack[top++] = 'b';
  90.                 printf("\t\tM->bLM\n");
  91.             }  else {
  92.                 return -1;
  93.             }
  94.             break;
  95.         default:
  96.             return -1;
  97.     }
  98.     return 0;
  99. }
  100. void print() {
  101.     int i;
  102.     for(i = 0; i < top; i++) {
  103.         printf("%c", stack[i]);
  104.     }
  105.     printf("\t\t");
  106.     for(i = 0; i < count; i++) {
  107.         printf(" ");
  108.     }
  109.     for(i = count; i < length; i++) {
  110.         printf("%c", str[i]);
  111.     }
  112. }
  113. int main() {
  114.     printf("\ta\tb\td\te\to\tf\t#\n");
  115.     printf("S\tS->a\tS->MH\tS->MH\tS->MH\tS->MH\t\tS->MH\n");
  116.     printf("H\t\t\t\tH->LSo\tH->ε\tH->ε\tH->ε\n");
  117.     printf("K\t\t\tK->dML\tK->ε\tK->ε\t\tK->ε\n");
  118.     printf("L\t\t\t\tL->eHf\t\t\t\n");
  119.     printf("M\t\tM->bLM\tM->K\tM->K\tM->K\t\tM->K\n");
  120.     while(1) {
  121.         printf("\n\n");
  122.         char c=' ';
  123.         int i = 0;
  124.         while(c!='#' && c!='$') {
  125.             scanf("%c", &c);
  126.             str[i++] = c;
  127.         }
  128.         getchar();
  129.         length = i;
  130.         top = 0;
  131.         stack[top++] = '#';
  132.         stack[top++] = 'S';
  133.         count = 0;
  134.         printf("栈\t\t输入串\t\t匹配或使用的产生式\n");
  135.         while(top-1 != 0 || count != length-1) {
  136.             if(stack[top-1] == str[count]) {
  137.                 print();
  138.                 printf("\t\t'%c'匹配\n", str[count]);
  139.                 top--;
  140.                 count++;
  141.             } else {
  142.                 print();
  143.                 if(matcher() == -1) {
  144.                     error();
  145.                     break;
  146.                 }
  147.             }
  148.         }
  149.         if(top-1 == 0 && count == length-1) {
  150.             print();
  151.             printf("\t\t接受\n");
  152.         }
  153.     }
  154.     return 0;
  155. }

运行效果图

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: