#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char input[255];//输入的字符串
char word[10];//存放单个的word
int p_input,p_tokenm,syn,num,m,row;
char ch;//读到的当前字符
char* rwtab[6]={"begin","if","then","while","do","end"};
void scaner();
void main(){
int over= 1;
row =1;
printf("请输入字符串,以#结束。\n");
scanf("%[^#]s",input);
p_input =0;
do{
num =0 ;
scaner();
switch(syn)
{
case 11 :printf("(%d,%d)\n",syn,num);break;
case -1:printf("End\n");break;
//case 0:return ;
default: printf("(%d,%s)\n",syn,word);break;
}
}while(syn!=-1);
return ;
}
void scaner()
{
int i;
for(i=0;i<8;i++)//初始化
word[i] = ' ';
ch = input[p_input++];
while(ch==' '||ch=='\n')//去除空格和换行
{
ch=input[p_input];
p_input++;
}
if(ch=='#')//判断是否输入结束
{
syn = 0;
return ;
}
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')//判读是否为变量
{
m=0;
while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
{
word[m++]= ch;
ch= input[p_input++];
}
word[m++]='\0';
for(i=0;i<6;i++)//判断该单词是否是关键字
{
if(strcmp(word,rwtab[i])==0)
{
syn = i+1;
break;
}
}
if(i==6)//说明不是关键字,则把syn设置为变量的syn
syn = 10;
}
else if(ch>='0'&&ch<='9')//判断数字
{
num = 0;//存放数字
while(ch>='0'&&ch<='9')
{
num= num*10+ch-'0';
ch = input[p_input++];
}
syn = 11;
p_input--;
}
else switch(ch)//其他符号
{
case ':':if(input[p_input+1]=='=')
{
word[0]=':';word[1]='=';word[2]='\0';
syn = 18;
p_input++;
}else
{
word[0] = ':';word[1]='\0';
syn = 17;
}break;
case '<':if(input[p_input+1]=='>')
{
word[0]='<';word[1]='>';word[2]='\0';
syn = 21;
p_input++;
}else if(input[p_input+1]=='=')
{
word[0]='<';word[1]='=';word[2]='\0';
syn = 22;
p_input++;
}else
{
word[0] = '<';word[1]='\0';
syn = 20;
}break;
case '>':if(input[p_input+1]=='=')
{
word[0]='>';word[1]='=';word[2]='\0';
syn = 24;
p_input++;
}else
{
word[0] = '>';word[1]='\0';
syn = 23;
}break;
case'*':syn=13;word[0]=ch;word[1]='\0';break;
case'/':syn=14;word[0]=ch;word[1]='\0';break;
case'+':syn=15;word[0]=ch;word[1]='\0';break;
case'-':syn=16;word[0]=ch;word[1]='\0';break;
case'=':syn=25;word[0]=ch;word[1]='\0';break;
case';':syn=26;word[0]=ch;word[1]='\0';break;
case'(':syn=27;word[0]=ch;word[1]='\0';break;
case')':syn=28;word[0]=ch;word[1]='\0';break;
case'#':syn=0;word[0]=ch;word[1]='\0';break;
case'\n':syn = -2;break;
default: syn=-1;word[0]='\0';break;
}
}
词法分析器
最新推荐文章于 2018-12-16 19:15:01 发布