编译原理--语法分析器

来源:互联网 发布:淘宝综合评分多少分 编辑:程序博客网 时间:2024/04/28 23:00
Code:
  1. #include<stdio.h>   
  2. #include<string.h>   
  3. char prog[80],token[8];   
  4. char ch;   
  5. int syn,p,m,n,sum,kk=0;   
  6. char *rwtab[6]={"beain","if","then","while","do","end"};   
  7.   
  8. main()   
  9. {p=0;   
  10. printf( "/n please input string : /n");   
  11. do {   
  12. ch=getchar();   
  13. prog[p++]=ch;   
  14. }   
  15. while(ch!='#');   
  16. p=0;   
  17. do  
  18. {  scaner();   
  19.   
  20.   
  21.   
  22. switch(syn)   
  23. {  case 11: printf("/n(%d,%d)",syn,sum);   
  24.    case -1: printf("/n (%s,False!)",token);   
  25.   default:  printf("/n(%d,%s)",syn,token);   
  26.    }   
  27.  }while(syn!=0);   
  28.  lrparser();   
  29.  system("pause");   
  30. }   
  31.   
  32.   
  33. scaner()   
  34. {   
  35.   
  36. for(n=0;n<8;n++) token[n]=NULL;   
  37. m=0;   
  38. sum=0;   
  39. ch=prog[p++];   
  40. while(ch==' ')   
  41. {ch=prog[p++];}   
  42. if(ch>='a'&&ch<='z')   
  43. {while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9')   
  44.   {token[m++]=ch;   
  45.   ch=prog[p++];   
  46.   }   
  47. token[m++]='/0';   
  48. p--;   
  49. syn=10;   
  50. for(n=0;n<6;n++)   
  51.   if(strcmp( token,rwtab[n])==0)   
  52.     {   
  53.     syn=1;   
  54.     break;   
  55.     }   
  56. }   
  57. else  
  58.     if(ch>='0'&& ch<='9')   
  59.     { while(ch>='0'&&ch<='9')   
  60.      {sum=sum*10+ch-'0';ch=prog[p++];   
  61.      }   
  62.     p--;   syn=11;   
  63. }   
  64. else  
  65. switch(ch)   
  66. {   
  67.  case'<': m=0; token[m++]=ch;   
  68.    ch=prog[p++];   
  69.    if(ch=='>')   
  70.    { syn=21;   
  71.    token[m++]=ch;   
  72.    }   
  73.    else if (ch=='=')   
  74.    { syn=22; token[m++]=ch;}   
  75.    else  
  76.     {syn=20; p--;   
  77.     break;   
  78. case '>': token[m++]=ch;   
  79.    ch=prog[p++];   
  80.    if(ch=='=')   
  81.    {syn=24; token[m++]=ch;   
  82.    }   
  83.    else  
  84.    {syn=23;p--;   
  85.    }break;   
  86. case ':': ch=prog[p++];   
  87.    if(ch=='=')   
  88.    {syn=26; token[m++]=ch;   
  89.    }   
  90.    else  
  91.    {syn=25; p--;   
  92.    }   
  93.    break;   
  94. case'+':syn=13;token[0]=ch;break;   
  95. case'-':syn=14;token[0]=ch;break;   
  96. case'*':syn=15;token[0]=ch;break;   
  97. case'/':syn=16;token[0]=ch;break;   
  98. case'#':syn=0;token[0]=ch;break;   
  99. default: syn=-1;   
  100.   }   
  101. }   
  102. }   
  103.   
  104.   
  105. lrparser(){   
  106.   
  107.  if(syn==1){   
  108.   scaner();   
  109.   
  110.   yucu();   
  111.      if(syn==6){   
  112.   scaner();   
  113.      if(syn==0&&(kk==0))   
  114.   printf("success!");   
  115.   
  116.   }   
  117.   else {if(kk!=1)  printf("missing end error!");kk=1;   
  118.   
  119.   }   
  120.   }   
  121.   else{ printf("begin  error");kk=1; }   
  122.   return;   
  123.   
  124.   
  125. }   
  126.   
  127.   
  128. yucu(){   
  129.   statement();   
  130.   while(syn==26){   
  131.    scaner();   
  132.    statement();   
  133.   
  134.   }   
  135.    return;   
  136. }   
  137.   
  138. statement(){   
  139.   if(syn==10){   
  140.    scaner();   
  141.    if(syn==18){   
  142.    scaner();   
  143.    expression();   
  144.   
  145.    }   
  146.    else {printf(" error" );kk=1;}   
  147.   }   
  148.   else { printf("input statement error");kk=1;   
  149.   }   
  150.    return;   
  151. }   
  152.   
  153.   
  154. expression(){   
  155.  term();   
  156.  while(syn==13||syn==14){   
  157.   scaner();   
  158.   term();   
  159.  }   
  160.   
  161.    return 0;   
  162.   
  163. }   
  164.   
  165.   
  166. term() {   
  167.  factor();   
  168.  while(syn==15||syn==16){   
  169.   scaner();   
  170.   factor();   
  171.  }   
  172.   return 0;   
  173.   
  174. }   
  175.   
  176.   
  177.   
  178. factor(){   
  179.  if(syn==10||syn==11)   
  180.   scaner();   
  181.   else if(syn==27){   
  182.    scaner();   
  183.    expression();   
  184.    if(syn==28)   
  185.    scaner();   
  186.    else{printf(" ')' error!");kk=1;}   
  187.   
  188.   
  189.   }   
  190.   else {  printf("expression error");kk=1;}   
  191.   return 0;   
  192.   
  193.  }   
  194.   
  195.   
  196.   

 

原创粉丝点击