资源描述
用C语言实现词法分析器
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct
{
int typenum;
char *word;
}WORD;
char input[255];
char token[255]="";
int p_input;
int p_token;
char ch;
char* rwtab[]={"main","if","then","while","do","static","int","double","struct","break","else","long","switch","case","typedef","char","return","const","float","short","continue","for","void","defult","sizeof","do","printf","include","scanf",_KEY_WORD_END};
WORD* scaner();
int main()
{
int over=1;
WORD* oneword= malloc(sizeof(WORD));
printf("Enter Your words(end with $):");
scanf("%[^$]s",input);
p_input=0;
printf("Your words:\n%s\n",input);
while(over<1000&over!=-1){
oneword=scaner();
if(oneword->typenum<1000)
printf("(%d,%s)",oneword->typenum,oneword->word);
over=oneword->typenum;
}
// printf("\npress $ to exit: ");
scanf("%[^$]s",input);
system("pause");
return 0;
}
//**************************************************************************************************
char m_getch(){
ch=input[p_input];
p_input=p_input+1;
return(ch);
}//得到字符
void getbc(){
while(ch==' '|| ch==10){
ch=input[p_input];
p_input=p_input+1;
}
} //去空格
void concat(){
token[p_token]=ch;
p_token=p_token+1;
token[p_token]='\0';
}//连接单词
int letter(){
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
return 1;
else
return 0;
}//判断字母
int digit(){
if(ch>='0'&&ch<='9')
return 1;
else
return 0;
}//判断数字
int reserve(){
int i=0;
while(strcmp(rwtab[i],_KEY_WORD_END)){
if(!strcmp(rwtab[i],token))
{
return i+1;
}
i++;}
return 10;
}//找关键字
void retract(){
p_input=p_input-1;
}//回退字符
char* dtb(){
}
//********************************************************************************
WORD *scaner()
{
WORD *myword = malloc(sizeof(WORD));
myword -> typenum = 10;
myword -> word = "";
p_token = 0;
m_getch();
getbc();
if(letter())
{
while(letter()||digit())
{
concat();
m_getch();
}
retract();
myword -> typenum =reserve();
myword -> word = token;
printf("\n");
return(myword);
}
else if(digit())
{
while(digit())
{
concat();
m_getch();
}
retract();
myword -> typenum = 20;
myword -> word = token;
printf("\n");
return(myword);
}
else switch(ch)
{
case'=':
m_getch();
if(ch == '=')
{
myword -> typenum = 39;
myword -> word = "==";
printf("\n");
return(myword);
}
retract();
myword -> typenum = 21;
myword -> word = "=";
printf("\n");
return(myword);
break;
case'+':
myword -> typenum = 22;
myword -> word = "+";
printf("\n");
return(myword);
break;
case'-':
myword -> typenum = 23;
myword -> word = "-";
printf("\n");
return(myword);
break;
case'*':
myword -> typenum = 24;
myword -> word = "*";
printf("\n");
return(myword);
break;
case'/':
myword -> typenum = 25;
myword -> word = "/";
printf("\n");
return(myword);
break;
case'(':
myword -> typenum = 26;
myword -> word = "(";
printf("\n");
return(myword);
break;
case')':
myword -> typenum = 27;
myword -> word = ")";
printf("\n");
return(myword);
break;
case'[':
myword -> typenum = 28;
myword -> word = "[";
printf("\n");
return(myword);
break;
case']':
myword -> typenum = 29;
myword -> word = "]";
printf("\n");
return(myword);
break;
case'{':
myword -> typenum = 30;
myword -> word = "{";
printf("\n");
return(myword);
break;
case'}':
myword -> typenum = 31;
myword -> word = "}";
printf("\n");
return(myword);
break;
case',':
myword -> typenum = 32;
myword -> word = ",";
printf("\n");
return(myword);
break;
case':':
myword -> typenum = 33;
myword -> word = ":";
printf("\n");
return(myword);
break;
case';':
myword -> typenum = 34;
myword -> word = ";";
printf("\n");
return(myword);
break;
case'>':
m_getch();
if(ch == '=')
{
myword -> typenum = 37;
myword -> word = ">=";
printf("\n");
return(myword);
}
retract();
myword -> typenum = 35;
myword -> word = ">";
printf("\n");
return(myword);
break;
case'<':
m_getch();
if(ch == '=')
{
myword -> typenum = 38;
myword -> word = "<=";
printf("\n");
return(myword);
}
retract();
myword -> typenum = 36;
myword -> word = "<";
printf("\n");
return(myword);
break;
case'!':
m_getch();
if(ch == '=')
{
myword -> typenum = 40;
myword -> word = "!=";
printf("\n");
return(myword);
}
retract();
myword -> typenum = -1;
myword -> word = "ERROR";
printf("\n");
return(myword);
break;
case'\0':
myword -> typenum = 1000;
myword -> word = "OVER";
printf("\n");
return(myword);
break;
case '#':
myword -> typenum = 41;
myword -> word = "#";
printf("\n");
return(myword);
break;
case '"':
myword -> typenum = 41;
myword -> word = "\"";
printf("\n");
return(myword);
break;
case '%':
myword -> typenum = 41;
myword -> word = "%";
printf("\n");
return(myword);
break;
default:
myword -> typenum = -1;
myword -> word = "ERROR";
printf("\n");
return(myword);
}
}
展开阅读全文