一个简单的C语言词法分析器!
#include <stdio.h>char *table[]={"while","if","else","switch","case"};
void main(){
void Input(char *const str);
void Deal(char *str);
char str[100]=" ";
Input(str);
Deal(str);
}
void Deal(char *str){
char *head=str;
char *tail=str;
char token[6];
int i=0,j=0;
while(j=0,i=0,*head!='\0'){
char ch;
ch=*tail;
//第一个字符为字母
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) {
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[i++]=ch;
ch=*++tail;
}
token[i]='\0';
// printf("%s",token);
head=tail;
for(i=0;i<5;i++)
if(!strcmp(table[i],token)) {
printf("<%d,%s>\n",i+1,token);
break;
}
if(i==5) { printf("<%d,%s>\n",i+1,token);}
}
//第一个字符为数字
else if((ch>='0'&&ch<='9')){
while((ch>='0'&&ch<='9'))
{
token[i++]=ch;
ch=*++tail;
}
token[i]='\0';
head=tail;
printf("<%d,%s>\n",7,token);
}
//第一个字符为其它字符
else switch(ch){
case ' ': head=++tail;break;//跳过空格字符
case '+': printf("<%d,%c>\n",8,ch);head=++tail;break;
case '-': printf("<%d,%c>\n",9,ch);head=++tail;break;
case '*': printf("<%d,%c>\n",10,ch);head=++tail;break;
case '=':
if(*(tail+1)=='=') printf("<%d,%c%c>\n",11,ch,*(++tail));
else printf("<%d,%c>\n",12,ch);
head=++tail;break;
case '<':
if(*(tail+1)=='=') printf("<%d,%c%c>\n",11,ch,*(++tail));
else printf("<%d,%c>\n",11,ch);
head=++tail;break;
case ')': printf("<%d,%c>\n",13,ch);head=++tail;break;
case '(': printf("<%d,%c>\n",14,ch);head=++tail;break;
case ';': printf("<%d,%c>\n",15,ch);head=++tail;break;
}
//
// token[i++]=*tail++;
//
//
// token[i]='\0';
//// for(j=0;j<i;j++)
//// printf("%c",token[j]);
// printf("%s",token);
//// if(!strcmp())
// if((*tail)=='\0') break;
// head=++tail;
// printf("\n");
}
}
void Input(char *const str){
char input;
char *p=str;
int i=0;
while(scanf("%c",&input)==1&&input!='\n'){
str[i++]=input;
}
str[i]='\0';
// while(*p!='\0'){
// printf("%c",*p++);
// }
// printf("\n");
}