zoukankan      html  css  js  c++  java
  • 我的词法分析程序之实现

         这次的实验是编制一个词法分析程序,要求输入一源程序的字符串,然后以二元组的形式输出种别,单词。在我看来就是将输入的所有字符串进行判断,根据字符串的不同性质分为不同的种别码,然后以单词符号的形式进行输出。

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 char compare[10];//分开进行比较
      5 char ch;
      6 /*char rwtab[6]={"begin","if","then","while","do","end"};*/
      7 char r1[]={"begin"};
      8 char r2[]={"if"};
      9 char r3[]={"then"};
     10 char r4[]={"while"};
     11 char r5[]={"do"};
     12 char r6[]={"end"};
     13 
     14 char All[10000];//输入的所有值
     15 int syn,row;//syn是种别码
     16 int n,m,p,num,j;
     17 static int i = 0;
     18 void scaner();
     19 int main()
     20 {  
     21     row = 0 ;
     22     p   = 0 ;
     23     printf("Please input something:(end of '$')
    ");
     24     do
     25     {
     26         scanf("%c",&ch);
     27         All[p]=ch;
     28         p++;
     29     }//输入值到数组A【】中,以$结束
     30     while(ch!='$');
     31     do
     32     {
     33         scaner();//进入函数进行判定
     34         switch(syn)
     35         {
     36         case 7: printf("(%d,%d)
    ",syn,num); break;//如果是7,那么就是数字  
     37         case 0:  printf("(%d,%c)
    ",syn,compare[0]);break;//如果是0,那么是$ 结束
     38         case -2: row=row++;break;
     39         default: printf("(%d,%s)
    ",syn,compare);break;//否则,就是变量名、关键词
     40         }
     41     }
     42     while (syn!=29);
     43 }
     44 void scaner()
     45 {
     46     /*
     47         共分为三大块,分别是标示符、数字、符号,对应下面的 if   else if  和 else
     48        
     49    
     50     */  
     51     for(n=0;n<7;n++)
     52           compare[n]=0;//每次循环完就清零
     53     ch=All[i];
     54     while(ch==' '||ch=='
    ')//如果字符是空格或者回车,跳过
     55     {
     56         i++;
     57         ch=All[i];
     58     }
     59     if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))  //可能是标示符或者变量名
     60     {
     61         m=0;
     62         while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//找到一个变量名或者关键字,直到遇到空格为止
     63         {
     64             compare[m]=ch;m++;
     65             i++;ch=All[i];
     66         }
     67         compare[m]='';
     68               //将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2......
     69               if(strcmp(compare,r1)==0){syn=1;}
     70               else if(strcmp(compare,r2)==0){syn=2; }
     71               else if(strcmp(compare,r3)==0){syn=3;}                             
     72               else if(strcmp(compare,r4)==0){syn=4;}
     73               else if(strcmp(compare,r5)==0){syn=5;}
     74               else if(strcmp(compare,r6)==0){syn=6;}
     75               else{syn=100;}    //变量名
     76     }
     77     else if((ch>='0'&&ch<='9'))  //数字
     78     {
     79         num=0;
     80         while((ch>='0'&&ch<='9'))
     81         {
     82             num=num*10+ch-'0';//显示其数字sum
     83             i++;
     84             ch=All[i];
     85         }
     86         syn=7;//数字是7
     87     }
     88     else switch(ch)   //其他字符
     89     {
     90         case'<':m=0;compare[m]=ch;m++;
     91             i++;ch=All[i];
     92             if(ch=='=')//<=为21
     93             {
     94                 syn=21;
     95                 compare[m]=ch;m++;i++;
     96             }
     97             else
     98             {
     99                 syn=20;//<为20
    100             }
    101             break;
    102         case'>':m=0;compare[m]=ch;m++;
    103             i++;ch=All[i];
    104             if(ch=='=')
    105             {
    106                 syn=24;
    107                 compare[m]=ch;m++;i++;
    108             }
    109             else
    110             {
    111                 syn=23;
    112             }
    113             break;
    114         case':':m=0;compare[m]=ch;m++;
    115             i++;ch=All[i];
    116             if(ch=='=')
    117             {
    118                 syn=18;
    119                 compare[m]=ch;m++;i++;
    120             }
    121             else
    122             {
    123                 syn=17;
    124             }
    125             break;
    126         case'"':syn=10;compare[0]=ch;i++;break;  
    127         case',':syn=11;compare[0]=ch;i++;break;    
    128         case'.':syn=12;compare[0]=ch;i++;break;        
    129         case'+':syn=13;compare[0]=ch;i++;break;
    130         case'-':syn=14;compare[0]=ch;i++;break;
    131         case'*':syn=15;compare[0]=ch;i++;break;
    132         case'/':syn=16;compare[0]=ch;i++;break;
    133         case'=':syn=25;compare[0]=ch;i++;break;
    134         case';':syn=26;compare[0]=ch;i++;break;
    135         case'(':syn=27;compare[0]=ch;i++;break;
    136         case')':syn=28;compare[0]=ch;i++;break;
    137         case'#':syn=0;compare[0]=ch;i++;break;
    138         case'$':syn=29;compare[0]=ch;i++;break;
    139         case'{':syn=30;compare[0]=ch;i++;break;
    140         case'}':syn=31;compare[0]=ch;i++;break;
    141         case'
    ':syn=-2;break;
    142         default: syn=-1;break;
    143     }
    144 }

          以上便是我的源代码,这个是源代码编译的结果

    我编写的种别码如下

    词法规则分析

    字母 A→{a....z&A...Z} S→A|AA

    数字 B→{1,2,3,4,5,6,7,8,9} S→B|BB|B0

    关键字 C→{begin,if,end,do,while,then}

    符号 D→{""".",","+".......}

  • 相关阅读:
    定义一个JobService,开启本地服务和远程服务
    提高Service优先级
    app中使用
    在java中
    每天学习点--------第六天(2017-10-10) 摘要: mysql和Oracle的区别
    每天学习点--------第五天(2017-10-9) 摘要: 常用的集合
    每天学习点--------第三天(2017-09-12)
    每天学习点--------第二天(2017-09-09)
    每天学习点--------第一天(2017-09-08)
    java开源安全框架-------Apache Shiro--第一天
  • 原文地址:https://www.cnblogs.com/wxf2/p/5925333.html
Copyright © 2011-2022 走看看