词法分析器
1 #include <stdio.h> 2 char prog[100]={'\0'}; 3 char token[9]; 4 char ch; 5 int syn,n,sum,p; 6 void scaner(){ 7 int m=0; 8 sum=0; 9 char *r[7]={"begin","if","then","for","while","do","end"};//数组存放关键字 10 for(n=0;n<9;n++) 11 token[n]='\0'; 12 ch=prog[p++]; 13 while(ch==' ') 14 ch=prog[p++]; 15 if(isalpha(ch)) /*ch为字母字符*/ 16 { 17 while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/ 18 { 19 token[m++]=ch; 20 ch=prog[p++];} 21 token[m++]='\0'; 22 ch=prog[p--]; 23 syn=10; 24 for(n=0;n<7;n++) 25 if(strcmp(token,r[n])==0) /*字符串的比较*/ 26 { 27 syn=n+1; 28 break;}} 29 else 30 31 if(isdigit(ch)) /*ch是数字字符*/ 32 { 33 while(isdigit(ch)) /*ch是数字字符*/ 34 { 35 sum=sum*10+ch-'0'; 36 ch=prog[p++];} 37 ch=prog[p--]; 38 syn=11;} 39 40 else 41 switch(ch){ 42 case'<':m=0;token[m++]=ch;ch=prog[p++]; 43 if(ch=='>'){ 44 syn=21; 45 token[m++]=ch;} 46 else if(ch=='='){ 47 syn=22; 48 token[m++]=ch;} 49 else{ 50 syn=20; 51 ch=prog[p--];} 52 break; 53 case'>':m=0;token[m++]=ch;ch=prog[p++]; 54 if(ch=='='){ 55 syn=24; 56 token[m++]=ch;} 57 else{ 58 syn=23; 59 ch=prog[p--];} 60 break; 61 case':':m=0;token[m++]=ch;ch=prog[p++]; 62 if(ch=='='){ 63 syn=18; 64 token[m++]=ch;} 65 else{ 66 syn=17; 67 ch=prog[p--];} 68 break; 69 case'+':syn=13;token[0]=ch;break; 70 case'-':syn=14;token[0]=ch;break; 71 case'*':syn=15;token[0]=ch;break; 72 case'/':syn=16;token[0]=ch;break; 73 case'=':syn=25;token[0]=ch;break; 74 case';':syn=26;token[0]=ch;break; 75 case'(':syn=27;token[0]=ch;break; 76 case')':syn=28;token[0]=ch;break; 77 case'!':syn=29;token[0]=ch;break; 78 case'#':syn=0;token[0]=ch;break; 79 default:syn=-1;} 80 } 81 void put(){ 82 p=0; 83 do{ 84 scaner(); 85 switch(syn){ 86 case 11: printf("(%d,%d)\n",syn,sum);break; 87 case -1: printf("不存在");break; 88 default: printf("(%d,%s)\n",syn,token);} 89 }while(syn!=0); 90 getch(); 91 } 92 void memun(){ 93 printf("\t\t\t欢迎使用词法分析程序!!\n"); 94 printf(" 单词符号 种别码 单词符号 种别码\n"); 95 printf(" begin 1 : 17 \n"); 96 printf(" if 2 := 18 \n"); 97 printf(" then 3 < 20\n"); 98 printf(" for 4 <> 21\n"); 99 printf(" while 5 <= 22\n"); 100 printf(" do 6 > 23\n"); 101 printf(" end 7 >= 24\n"); 102 printf(" l(l|d)* 10 = 25\n"); 103 printf(" dd* 11 ; 26\n"); 104 printf(" + 13 ( 27\n"); 105 printf(" - 14 ) 28\n"); 106 printf(" * 15 ! 29\n"); 107 printf(" / 16 # 0 \n"); 108 } 109 main(){ 110 p=0; 111 memun(); 112 printf("请输入字符串(直到#退出):\n"); 113 do { 114 ch=getchar(); 115 prog[p++]=ch; 116 }while(ch!='#'); 117 put(); 118 }
词法规则
<字母>A→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z S→SA
•<数字>A→0|1|2|3|4|5|6|7|8|9 S→SA
•<整数常数> A→1|2|3|4|5|6|7|8|9 B→0 S→SA|SB
•<标识符>A→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
B→0|1|2|3|4|5|6|7|8|9 S→ASB
•<关键字>
A→const|var|procedur|begin|end|odd|if|then|call|while|do|read|write
S→SA
•<运算符>A→+|-|*|/|<=|>=|<|> S→SA
•<界符>A→(|) B→,|;|. S→ASB
欢迎大家指出我的错误!!!