首页 > 代码库 > 词法分析器
词法分析器
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
欢迎大家指出我的错误!!!
词法分析器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。