0916 编程实验一 词法分析程序

源程序:

  1 #include<stdio.h>
  2 #include<string.h>
  3 void Fenxi(char c,char b);
  4 void word(char a[]);
  5 void number(char a[]);
  6 int i; 
  7 int s=1; //用来记录是否存在非法字符
  8 main(){
  9 char a[50];
 10 printf("请输入源程序:");
 11 gets(a);
 12 printf("您要分析的源程序为:");
 13 printf("%s",a);
 14 printf("
");
 15 for(i=0;(a[i]!='')&&(i<50)&&s==1;i++)
 16 {
 17 if((a[i]>='a' && a[i]<='z')||(a[i]>='A' && a[i]<='Z'))
 18 word(a);
 19 else if(a[i]>='0' && a[i]<='9')
 20 number(a);
 21 else
 22 Fenxi(a[i],a[i+1]);
 23 }
 24 printf("
");
 25 }
 26 
 27 void number(char a[]) //对数字字符进行扫描分析
 28 {
 29 char b[50];
 30 int m,k=0,t;
 31 m=i;
 32 while(a[m]>='0' && a[m]<='9') 
 33 {
 34 b[k]=a[m]; //用数组b存放数组a中的数字
 35 k++;
 36 m++;
 37 }
 38 i=m-1;
 39 printf("(11,");
 40 for(t=0;t<k;t++)
 41 printf("%c",b[t]);
 42 printf(")");
 43 }
 44 
 45 void word(char a[]) //对字母字符进行扫描分析,并识别保留字
 46 {
 47 int k=0,m,flag=0,t;
 48 char b[50];
 49 char *key[6]={"begin","if","then","while","do","end"};
 50 m=i;
 51 while((a[m]>='a'&&a[m]<='z')||(a[m]>='A'&&a[m]<='Z')) //用数组b存放数组a中的字母
 52 {
 53 b[k]=a[m]; 
 54 k++;
 55 b[k]='';
 56 m++; 
 57 }
 58 i=m-1;
 59 for(t=0;t<6;t++)
 60 {
 61 if(strcmp(b,key[t])==0) //将数组b与关键字进行比较
 62 {
 63 printf("(%d,%s)",t+1,key[t]); //输出关键字
 64 flag=1;
 65 }
 66 }
 67 if(flag==0)
 68 {
 69 printf("(10,%s)",b); //输出标识符
 70 }
 71 }
 72 void Fenxi(char c,char b) //对特殊字符进行扫描分析
 73 {
 74 switch(c){
 75 case ' ':
 76 break;
 77 case '+':
 78 printf("(13,+)");
 79 break;
 80 case '-':
 81 printf("(14,-)");
 82 break;
 83 case '*':
 84 printf("(15,*)");
 85 break;
 86 case '/':
 87 printf("(16,/)");
 88 break;
 89 case ':':
 90 if(b=='=')
 91 {
 92 i++;
 93 printf("(18,:=)");
 94 }
 95 else
 96 printf("(17,:)");
 97 break;
 98 case '<':
 99 if(b=='>')
100 {
101 i++;
102 printf("(21,<>)");
103 }
104 else if(b=='=')
105 {
106 i++;
107 printf("(22,<=)");
108 }
109 else
110 printf("(20,<)");
111 break;
112 case '>':
113 if(b=='=')
114 {
115 printf("(24,>=)");
116 i++;
117 }
118 else
119 printf("(23,>)");
120 break;
121 case '=':
122 printf("(25,=)");
123 break;
124 case ';':
125 printf("(26,;)");
126 break;
127 case '(':
128 printf("(27,()");
129 break;
130 case ')':
131 printf("(28,))");
132 break;
133 case '#':
134 printf("(20,#)");
135 break;
136 default:
137 {
138 printf("
存在字符 '%c',无法继续识别!
",c);
139 s=0; //用s=0记录存在非法字符
140 break;
141 }
142 }
143 }

运行结果:

 

原文地址:https://www.cnblogs.com/gjpg/p/4813987.html