2016.9.30词法分析程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2016.9.30词法分析程序相关的知识,希望对你有一定的参考价值。
单词符号 |
种别码 |
单词符号 |
种别码 |
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 |
#include<stdio.h> #include<string.h> #include<stdlib.h> char TOken[10];//分开进行比较 char ch; char r1[]={"begin"}; char r2[]={"if"}; char r3[]={"then"}; char r4[]={"while"}; char r5[]={"do"}; char r6[]={"end"}; char A[10000];//输入的所有值 int syn,row; int n,m,p,sum,j; static int i = 0; void scaner(); main() { row = 0 ; p = 0 ; printf("请输入字符串:(#为结束)\\n"); do { scanf("%c",&ch); A[p]=ch; p++; }//输入值到数组A【】中,以#结束 while(ch!=‘#‘); do { scaner();//进入函数进行判定 switch(syn) { case 11: printf("(%d,%d)\\n",syn,sum); break;//如果是11,那么就是数字 case 0: printf("(%d,%c)\\n",syn,TOken[0]);break;//如果是0,那么是# 结束 case -2: row=row++;break; case -1:break; default: printf("(%d,%s)\\n",syn,TOken);break;//否则,就是变量名、关键词 } } while (syn!=0); } void scaner() { for(n=0;n<7;n++) TOken[n]=0;//每次循环完就清零 ch=A[i]; while(ch==‘ ‘||ch==‘\\n‘)//如果字符是空格或者回车,跳过 { i++; ch=A[i]; } if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)) //可能是标示符或者变量名 { m=0; while((ch>=‘0‘&&ch<=‘9‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘))//找到一个变量名或者关键字,直到遇到空格为止 { TOken[m]=ch;m++; i++;ch=A[i]; } TOken[m]=‘\\0‘;//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2...... if(strcmp(TOken,r1)==0){syn=1;} else if(strcmp(TOken,r2)==0){syn=2;} else if(strcmp(TOken,r3)==0){syn=3;} else if(strcmp(TOken,r4)==0){syn=4;} else if(strcmp(TOken,r5)==0){syn=5;} else if(strcmp(TOken,r6)==0){syn=6;} else{syn=10;} //变量名 } else if((ch>=‘0‘&&ch<=‘9‘)) //数字 { sum=0; while((ch>=‘0‘&&ch<=‘9‘)) { sum=sum*10+ch-‘0‘;//显示其数字sum i++; ch=A[i]; } syn=11; } else switch(ch) //其他字符 { case‘<‘: m=0; TOken[m]=ch; m++; i++; ch=A[i]; if(ch==‘=‘) { syn=21; TOken[m]=ch; m++; i++; } else if(ch==‘>‘) { syn=22; TOken[m]=ch; m++; i++; } else { syn=20; }break; case‘>‘: m=0; TOken[m]=ch; m++; i++; ch=A[i]; if(ch==‘=‘) { syn=24; TOken[m]=ch; m++; i++; } else { syn=23; }break; case‘:‘: m=0; TOken[m]=ch; m++; i++; ch=A[i]; if(ch==‘=‘) { syn=18; TOken[m]=ch; m++; i++; } else { syn=17; }break; case‘+‘:syn=13;TOken[0]=ch;i++;break; case‘-‘:syn=14;TOken[0]=ch;i++;break; case‘*‘:syn=15;TOken[0]=ch;i++;break; case‘/‘:syn=16;TOken[0]=ch;i++;break; case‘=‘:syn=25;TOken[0]=ch;i++;break; case‘;‘:syn=26;TOken[0]=ch;i++;break; case‘(‘:syn=27;TOken[0]=ch;i++;break; case‘)‘:syn=28;TOken[0]=ch;i++;break; case‘#‘:syn=0;TOken[0]=ch;i++;break; case‘\\n‘:syn=-2;break; default:syn=-1; } }
以上是关于2016.9.30词法分析程序的主要内容,如果未能解决你的问题,请参考以下文章