首页 > 代码库 > 词法分析程序
词法分析程序
1 #include <stdio.h> 2 #include <string.h> 3 char prog[30],token[5],ch; 4 int syn,p,m,n,sum; 5 char *rwtab[6]={"begin","if","then","while","do","end"}; 6 scaner(); 7 main() 8 {p=0; 9 printf("请输入你要分析的程序(按“#”结束):"); 10 do{ 11 scanf("%c",&ch); 12 prog[p++]=ch; 13 }while(ch!=‘#‘); 14 p=0; 15 do{ scaner(); 16 switch(syn) 17 { case 11:printf("( %-10d%5d )\n",sum,syn); 18 break; 19 case -1:printf("you have input a wrong string\n"); 20 getch(); 21 exit(0); 22 default: printf("( %-10s%5d )\n",token,syn); 23 break; 24 } 25 }while(syn!=0); 26 getch(); 27 } 28 scaner() 29 { sum=0; 30 for(m=0;m<8;m++)token[m++]=NULL; 31 ch=prog[p++]; 32 m=0; 33 while((ch==‘ ‘)||(ch==‘\n‘))ch=prog[p++]; 34 if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))) 35 { 36 while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘))) 37 { 38 token[m++]=ch; 39 ch=prog[p++]; 40 } 41 p--; 42 syn=10; 43 for(n=0;n<6;n++) 44 if(strcmp(token,rwtab[n])==0) 45 { syn=n+1; 46 break; 47 } 48 } 49 else if((ch>=‘0‘)&&(ch<=‘9‘)) 50 { while((ch>=‘0‘)&&(ch<=‘9‘)) 51 { sum=sum*10+ch-‘0‘; 52 ch=prog[p++]; 53 } 54 p--; 55 syn=11; 56 } 57 else switch(ch) 58 { case ‘<‘:token[m++]=ch; 59 ch=prog[p++]; 60 if(ch==‘=‘) 61 { 62 syn=22; 63 token[m++]=ch; 64 } 65 else 66 { 67 syn=20; 68 p--; 69 } 70 break; 71 case ‘>‘:token[m++]=ch; 72 ch=prog[p++]; 73 if(ch==‘=‘) 74 { syn=24; 75 token[m++]=ch; 76 } 77 else 78 { syn=23; 79 p--; 80 } 81 break; 82 case ‘+‘: token[m++]=ch; 83 ch=prog[p++]; 84 if(ch==‘+‘) 85 { syn=17; 86 token[m++]=ch; 87 } 88 else 89 { syn=13; 90 p--; 91 } 92 break; 93 case ‘-‘:token[m++]=ch; 94 ch=prog[p++]; 95 if(ch==‘-‘) 96 { syn=29; 97 token[m++]=ch; 98 } 99 else 100 { syn=14; 101 p--; 102 } 103 break; 104 case ‘!‘:ch=prog[p++];105 if(ch==‘=‘) 106 { syn=21; 107 token[m++]=ch; 108 } 109 else 110 { syn=31;111 p--;112 } 113 break; 114 case ‘=‘:token[m++]=ch; 115 ch=prog[p++];116 if(ch==‘=‘) 117 { syn=25; 118 token[m++]=ch; 119 } 120 else 121 { syn=18; 122 p--; 123 } 124 break;125 case ‘*‘: syn=15; 126 token[m++]=ch; 127 break; 128 case ‘/‘: syn=16; 129 token[m++]=ch; 130 break; 131 case ‘(‘: syn=27;132 token[m++]=ch; 133 break; 134 case ‘)‘: syn=28; 135 token[m++]=ch; 136 break; 137 case ‘{‘: syn=5; 138 token[m++]=ch; 139 break; 140 case ‘}‘: syn=6;141 token[m++]=ch; 142 break; 143 case ‘;‘: syn=26; 144 token[m++]=ch; 145 break; 146 case ‘\"‘: syn=30; 147 token[m++]=ch; 148 break; 149 case ‘#‘: syn=0; 150 token[m++]=ch; 151 break; 152 case ‘:‘:syn=17; 153 token[m++]=ch; 154 break;155 default: syn=-1; 156 break; 157 }158 token[m++]=‘\0‘; 159 }
单词符号 | 种别码 | 单词符号 | 种别码 |
begin | 1 | : | 17 |
if | 2 | := | 18 |
then | 3 | < | 20 |
while | 4 | <= | 21 |
do | 5 | <> | 22 |
end | 6 | > | 23 |
l(l|d)* | 10 | >= | 24 |
dd* | 11 | = | 25 |
+ | 13 | ; | 26 |
- | 14 | ( | 27 |
* | 15 | ) | 28 |
/ | 16 | # | 0 |
词法分析程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。