ReadMe.txt
上传用户:qdzhkyjx
上传日期:2013-04-04
资源大小:43k
文件大小:4k
源码类别:

词法分析

开发平台:

Visual C++

  1. 主要的代码如下(这里给出的是命令行代码,稍加修改就可以做成源码中国演示图片的界面了)
  2.  
  3. #include
  4. #include
  5. #include
  6. #include
  7. #define  MAX 18   //分析表的最大容量
  8. #define  MAXBUF 255
  9. char  ch =' ';   // 存放读入当前的输入字符
  10. int lineno;
  11. struct reserve   //关键字
  12. {
  13.  char lexptr[MAXBUF];
  14.  int token;
  15. };
  16. struct reserve symtable[MAX];
  17. char * str[]={"program","input","output","begin","end","var","integer","real","for","to","if","then","else","do","while","write","array","proceure" };
  18. void init()     //对符号表进行初始化
  19. {
  20.  for( int j=0; j<18; j++)
  21.  { 
  22.   strcpy(symtable[j].lexptr,str[j]);
  23.   symtable[j].token=j+3;
  24.  }
  25. }
  26.  
  27. int search(char *temp)
  28. {
  29.  for(int i=0; i {
  30.   if(!strcmp(symtable[i].lexptr ,temp))
  31.   {
  32.    return  symtable[i].token;
  33.   }
  34.  }
  35.  return 0;
  36. }     
  37.  
  38. void analyse(FILE *fpin,FILE *fpout)    //分析程序
  39. {
  40.  char arr[MAXBUF];
  41.  int i=0;
  42.  int j=0;
  43.  
  44.  while((ch=fgetc(fpin))!=EOF)    //读入字符判断,空格、字母、数字、界符
  45.  {
  46.   if(ch==' '||ch=='t')
  47.   {
  48.    
  49.   }
  50.   else if(ch=='n')    //如果是换行符,则行号加1
  51.   {  
  52.    lineno++;
  53.   }
  54.   else if(isdigit(ch))   //如果是数字
  55.   { 
  56.    while(isdigit(ch))   //判断和读取数字
  57.    { 
  58.     arr[j]=ch;
  59.     j++;
  60.     ch=fgetc(fpin);
  61.    } 
  62.    arr[j]='';
  63.    j=0;
  64.    fseek(fpin,-1L,SEEK_CUR);
  65.    fprintf(fpout,"%st%dn",arr,2) ;
  66.   }
  67.   else if (isalpha(ch))  //如果是字母
  68.   {
  69.    while(isalpha(ch)||isdigit(ch))
  70.    {
  71.     arr[j]=ch;
  72.     j++;
  73.     ch=fgetc(fpin);
  74.    }
  75.    fseek(fpin,-1L,SEEK_CUR);
  76.    arr[j]='';
  77.    j=0;
  78.    if (search(arr)) //如果是关键字
  79.    {
  80.     fprintf(fpout,"%st%dn",arr,search(arr));
  81.    }
  82.    else  
  83.     fprintf(fpout,"%st%dn",arr,1); //普通标志符
  84.   }
  85.   else if(ch==':')  
  86.   {
  87.    ch=fgetc(fpin);
  88.    if(ch=='=') 
  89.    {
  90.     fprintf(fpout,"%st%dn",":=",29);    //如果是 :=
  91.    }
  92.    else
  93.    {
  94.     fprintf(fpout,"%st%dn",":",30);   //如果是 :
  95.     fseek(fpin,-1L,SEEK_CUR);
  96.    }
  97.   }
  98.   else if (ch=='>')
  99.   {
  100.    ch=fgetc(fpin);
  101.    if(ch=='=')    //如果是 >=
  102.    {
  103.     fprintf(fpout,"%st%dn",">=",32);
  104.    }
  105.    else
  106.    {
  107.     fprintf(fpout,"%st%dn",">",31);  //如果是 >
  108.     fseek(fpin,-1L,SEEK_CUR);
  109.    }
  110.   }
  111.   else if(ch=='<')
  112.   { 
  113.    ch=fgetc(fpin);
  114.    if(ch=='>')
  115.    {
  116.     fprintf(fpout,"%st%dn","<>",35);  // 如果是 <>
  117.    }
  118.    else if(ch=='=')
  119.    {
  120.     fprintf(fpout,"%st%dn","<=",34);   //如果是 <=
  121.    }
  122.    else 
  123.    {
  124.     fprintf(fpout,"%st%dn","<",33);   //如果是 <
  125.     fseek(fpin,-1L,SEEK_CUR);
  126.    }
  127.   }
  128.   else if(ch=='/')
  129.   { 
  130.    ch=fgetc(fpin);
  131.    if(ch=='*')
  132.    {
  133.     ch=fgetc(fpin);
  134. s:
  135.     while(ch!='*')
  136.     {
  137.      ch=fgetc(fpin);
  138.     }
  139.     while(ch=='*')
  140.     {
  141.      ch=fgetc(fpin);
  142.      while(ch!='/')
  143.      {
  144.       goto s;   //如果是注释 /*  */
  145.      }
  146.     }
  147.    }
  148.    else if(ch=='/')
  149.    {
  150.     ch=fgetc(fpin);
  151.     while(ch!='n')
  152.     {
  153.      ch=fgetc(fpin);   //如果是注释 //
  154.     }
  155.    }
  156.    else 
  157.    {  
  158.     fprintf(fpout,"%st%dn","/",24);
  159.     fseek(fpin,-1L,SEEK_CUR);
  160.    }
  161.   }
  162.   else if(ch=='+')
  163.   {
  164.    fprintf(fpout,"%st%dn","+",21);
  165.   }
  166.   else if(ch=='-')
  167.   {
  168.    fprintf(fpout,"%st%dn","-",22);
  169.   }
  170.   else if(ch=='*')
  171.   {
  172.    fprintf(fpout,"%st%dn","*",23);
  173.   }
  174.   else if(ch=='(')
  175.   {
  176.    fprintf(fpout,"%st%dn","(",25);
  177.   }
  178.   else if(ch==')')
  179.   {
  180.    fprintf(fpout,"%st%dn",")",26);
  181.   }
  182.   else if(ch=='[')
  183.   {
  184.    fprintf(fpout,"%st%dn","[",27);
  185.   }
  186.   else if(ch==']')
  187.   {
  188.    fprintf(fpout,"%st%dn","]",28);
  189.   }
  190.   else if(ch=='.')
  191.   {
  192.    fprintf(fpout,"%st%dn",".",39);
  193.   }
  194.   else if(ch==';')
  195.   {
  196.    fprintf(fpout,"%st%dn",";",36);
  197.   }
  198.   else if(ch=='=')
  199.   {
  200.    fprintf(fpout,"%st%dn","=",38);
  201.   }
  202.   else if(ch==',')
  203.   {
  204.    fprintf(fpout,"%st%dn",",",40);
  205.   }
  206.   else fprintf(fpout,"无法识别的字符 %cn",ch)  ;
  207.    }
  208. void main()
  209. {
  210.  printf("***************************词法分析器*************************nnn");
  211.  printf("直接输入源代码请按1,从文件中读入源代码请按2 n") ;
  212.  
  213.  
  214.  char filenamein[10];
  215.  char filenameout[10];
  216.    
  217.  printf("请输入源文件名:n");
  218.  scanf("%s",filenamein);
  219.  printf("请输入保存词法分析结果的文件名:n");
  220.  scanf("%s",filenameout);
  221.  FILE* fpin=fopen(filenamein,"r");
  222.  FILE* fpout=fopen(filenameout,"w");
  223.  init();
  224.  analyse(fpin,fpout);
  225.  fclose(fpin);
  226.  fclose(fpout);
  227.  
  228.  
  229.  _getch();
  230. }
  231.