aa.cpp
上传用户:dlqqsh
上传日期:2022-06-06
资源大小:1548k
文件大小:3k
源码类别:

词法分析

开发平台:

Visual C++

  1. # include <iostream>
  2. # include<string.h>
  3. //# include<stdio.h>
  4. //# include<ctype.h>
  5. //# include<conio.h>
  6. using namespace std;
  7. char pg[100],token[20]; //pg数组存放输入字符串,token为临时数组存放扫描时所读
  8. char ch;
  9. int syn,p,n,m,sum;
  10. char *rwtab[6]={"begin","if","then","while","do","end"};
  11. int scaner(char pg[])    //扫描函数
  12.  {
  13. for(n=0;n<20;n++) token[n]=NULL; 
  14. //int m,n,sum;
  15.       ch=pg[p++];
  16. while(ch==' ') 
  17. ch=pg[p++];
  18. if(ch>='a'&&ch<='z')
  19. {
  20.    n=0;
  21. while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'))
  22. {
  23. token[n++]=ch;
  24. ch=pg[p++];
  25. }
  26. token[n]='';
  27.  syn=10;
  28.  p--;
  29. for(m=0;m<6;m++)
  30. if(strcmp(token,rwtab[m])==0)
  31. {
  32. m++;
  33. syn=m;
  34. break;
  35. }
  36. }
  37. else
  38. if(ch>='0'&&ch<='9')
  39. {
  40.  sum=0;
  41. while(ch>='0'&&ch<='9')
  42. {
  43. sum=sum*10+ch-'0';
  44. ch=pg[p++];
  45. }
  46. syn=11;
  47. p--;
  48. }
  49. else
  50. switch(ch)
  51. {
  52. case '<': m=0; token[m++]=ch;
  53.       ch=pg[p++];
  54.       if(ch=='>'){syn=21;token[m++]=ch;}
  55.         else if(ch=='='){syn=22;token[m++]=ch;}
  56.   else{syn=20;p--;}break;
  57.                     case '>': m=0; token[m++]=ch;
  58.       ch=pg[p++];
  59.         if(ch=='='){syn=24;token[m++]=ch;}
  60.         else{syn=23;p--;}break;
  61.                     case ':': m=0; token[m++]=ch;
  62.       ch=pg[p++];
  63.         if(ch=='='){syn=18;token[m++]=ch;}
  64.   else{syn=17;p--;}break;
  65.                     case '/': m=0; token[m++]=ch;
  66.       ch=pg[p++];
  67.         if(ch=='*')
  68.   {
  69.   do
  70.   {
  71.   token[m++]=ch;
  72.   ch=pg[p++];
  73.   }while(ch!='*');
  74.  token[m++]=ch;
  75.   ch=pg[p++];
  76.   if(ch=='/')   {token[m++]=ch;syn=-2;}
  77.   }
  78.   else{syn=16;p--;}break;
  79. case '+': syn=13;token[0]=ch;break; 
  80. case '-': syn=14;token[0]=ch;break;
  81. case '*': syn=15;token[0]=ch;break;
  82. case '=': syn=25;token[0]=ch;break;
  83. case ';': syn=26;token[0]=ch;break;
  84. case '(': syn=27;token[0]=ch;break;
  85. case ')': syn=28;token[0]=ch;break;
  86. case '#': syn=0;token[0]=ch;break;
  87. default: syn=-1;
  88. }
  89. return syn;
  90.  }
  91. void main()
  92. {
  93. p=0;
  94. while(1)
  95. {
  96. cout<<endl<<endl;
  97. printf( " please input string and end with #:n");
  98. do
  99. {
  100.    pg[p]=ch=cin.get();
  101.             p++;
  102. }while(ch!='#');
  103. p=0;
  104. do
  105. {
  106.     syn=scaner(pg);
  107. switch(syn)
  108. {
  109. case 11:  cout<<"("<<syn<<","<<sum<<")"<<endl;break;
  110.         case -1:  cout<<"你输入的字符无法识别请重新输入!"<<endl;break;
  111.         case -2:   cout<<"This is defination:"<<endl;cout<<token<<endl;break;
  112. default: 
  113.      /*int mm=strlen(token);
  114.  //mm=strlen(token); 
  115.      if(mm==1&&(token[0]>='a'&&token[0]<='z'))  
  116.  {
  117.  cout<<"("<<syn<<",'";
  118.   cout<<token<<"')"<<endl;
  119.  }
  120. else*/
  121.  
  122. cout<<"("<<syn<<",";cout<<token<<")"<<endl;
  123.  
  124. }
  125. }while(syn!=0);
  126. }
  127. }