词法分析器
Posted 悦动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析器相关的知识,希望对你有一定的参考价值。
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
欢迎大家指出我的错误!!!
以上是关于词法分析器的主要内容,如果未能解决你的问题,请参考以下文章