码迷,mamicode.com
首页 > 其他好文 > 详细

0917词法分析

时间:2015-10-07 13:20:47      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

  1. #include<stdio.h>  
  2. #include<string.h>  
  3. char input[200];//存放输入字符串   
  4. char token[5];//存放构成单词符号的字符串   
  5. char ch;     //存放当前读入字符   
  6. int p;       //input[]下标   
  7. int fg;     //switch标记   
  8. int num;    //存放整形值   
  9.   
  10. //二维字符数组,存放关键字   
  11. char index[6][6]={"begin","if","then","while","do","end"};  
  12. main()  
  13. {  
  14.  p=0;  
  15.  printf("please intput string(End with ‘#‘):\n");  
  16. do  
  17. {  
  18.  ch=getchar();  
  19.  input[p++]=ch;  
  20. }while(ch!=‘#‘);  
  21. p=0;  
  22. do  
  23. {  
  24.  scaner();  
  25.  switch(fg)  
  26.  {  
  27.   case 11:printf("( %d,%d )   ",fg,num);break;  
  28.   case -1:printf("input error\n");  break;  
  29.   default:printf("( %d,%s )   ",fg,token);  
  30.  }  
  31. }while(fg!=0);  
  32. getch(); //用于让程序停留在显示页面  
  33. }  
  34. /*词法扫描程序:*/  
  35. scaner()  
  36. {  
  37.     int m=0;//token[]下标   
  38.     int n;  
  39.       
  40.     //清空token[]   
  41.     for(n=0;n<5;n++)  
  42.        token[n]=NULL;  
  43.     
  44.     //获取第一个不为0字符   
  45.     ch=input[p++];  
  46.     while(ch==‘ ‘)ch=input[p++];  
  47.     
  48.     //关键字(标识符)处理流程   
  49.     if((ch<=‘z‘&&ch>=‘a‘)||(ch<=‘Z‘&&ch>=‘A‘))  
  50.        {  
  51.           while((ch<=‘z‘&&ch>=‘a‘)||(ch<=‘Z‘&&ch>=‘A‘)||(ch<=‘9‘&&ch>=‘0‘))  
  52.              {  
  53.                  token[m++]=ch;  
  54.                  ch=input[p++];  
  55.              }  
  56.           token[m++]=‘\0‘;  
  57.           ch=input[--p];  
  58.           fg=10;  
  59.           for(n=0;n<6;n++)  
  60.              if(strcmp(token,index[n])==0)//strcmp()比较两个字符串,相等返回0   
  61.                  {  
  62.                     fg=n+1;  
  63.                     break;  
  64.                  }  
  65.        }  
  66.          
  67.      //数字处理流程   
  68.      else if((ch<=‘9‘&&ch>=‘0‘))  
  69.      {  
  70.           num=0;  
  71.           while((ch<=‘9‘&&ch>=‘0‘))  
  72.           {  
  73.            num=num*10+ch-‘0‘;  
  74.            ch=input[p++];  
  75.           }  
  76.            ch=input[--p];  
  77.            fg=11;  
  78.      }  
  79.        
  80.      //运算符界符处理流程   
  81.      else  
  82.          switch(ch)  
  83.           {  
  84.              case ‘<‘:  
  85.                  m=0;  
  86.                  token[m++]=ch;  
  87.                  ch=input[p++];  
  88.                  if(ch==‘>‘)          //产生<>   
  89.                    {  
  90.                       fg=21;  
  91.                       token[m++]=ch;  
  92.                     }  
  93.                  else if(ch==‘=‘)     //产生<=   
  94.                    {  
  95.                       fg=22;  
  96.                       token[m++]=ch;  
  97.                    }  
  98.                  else  
  99.                    {  
  100.                       fg=20;  
  101.                       ch=input[--p];  
  102.                    }  
  103.                  break;  
  104.              case ‘>‘:  
  105.                  token[m++]=ch;  
  106.                  ch=input[p++];  
  107.                  if(ch==‘=‘)        //产生>=   
  108.                    {  
  109.                       fg=24;  
  110.                       token[m++]=ch;  
  111.                    }  
  112.                  else               //产生>   
  113.                    {  
  114.                       fg=23;  
  115.                       ch=input[--p];  
  116.                    }  
  117.                  break;   
  118.              case ‘:‘:  
  119.                  token[m++]=ch;  
  120.                  ch=input[p++];  
  121.                  if(ch==‘=‘)        //产生:=   
  122.                    {  
  123.                       fg=18;  
  124.                       token[m++]=ch;  
  125.                    }  
  126.                  else              //产生:   
  127.                    {  
  128.                       fg=17;  
  129.                       ch=input[--p];  
  130.                    }  
  131.                  break;  
  132.             case ‘+‘:fg=13;token[0]=ch;break;  
  133.             case ‘-‘:fg=14;token[0]=ch;break;  
  134.             case ‘*‘:fg=15;token[0]=ch;break;  
  135.             case ‘/‘:fg=16;token[0]=ch;break;  
  136.             case ‘:=‘:fg=18;token[0]=ch;break;  
  137.             case ‘<>‘:fg=21;token[0]=ch;break;  
  138.             case ‘<=‘:fg=22;token[0]=ch;break;  
  139.             case ‘>=‘:fg=24;token[0]=ch;break;  
  140.             case ‘=‘:fg=25;token[0]=ch;break;  
  141.             case ‘;‘:fg=26;token[0]=ch;break;  
  142.             case ‘(‘:fg=27;token[0]=ch;break;  
  143.             case ‘)‘:fg=28;token[0]=ch;break;  
  144.             case ‘#‘:fg=0;token[0]=ch;break;  
  145.             default:fg=-1;  
  146.         }  
  147. }  

0917词法分析

标签:

原文地址:http://www.cnblogs.com/lssh/p/4858491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!