您的位置:首页 > 其它

1029词法分析

2015-10-29 14:59 260 查看
#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[]={"begin","if","then","while","do","end",_KEY_WORD_END};        //C语言关键字
WORD * scaner();    //词法扫描函数,获得关键字

main()
{
int over=1;
WORD *oneword;
oneword=(WORD *)malloc(sizeof(WORD));
printf("Input your code(end with #):");   //读入源程序字符串到缓冲区,以#结束,允许多行输入
scanf("%[^#]s",input);
p_input=0;
printf("The code is:\n%s\n\n",input);
while(over<1000&&over!=-1)
{
oneword=scaner();
printf("(%d,%s)\n",oneword->typenum,oneword->word);
over=oneword->typenum;
}
}

//需要用到的自编函数参考实现

//从输入缓冲区读取一个字符到ch中

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=i+1;
}
return 10;
}

//回退一个字符

void retract()
{
p_input=p_input-1;
}

WORD *scaner()//扫描单词
{
WORD *myword;
myword=(WORD *)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;
return(myword);
}
else if(digit())
{
while(digit())
{
concat();
m_getch();
}
retract();
myword->typenum=11;
myword->word=token;
return(myword);
}
else
{
switch(ch)
{
case'+':
myword->typenum=13;
myword->word="+";
return(myword);
break;
case'-':
myword->typenum=14;
myword->word="-";
return(myword);
break;
case'*':
myword->typenum=15;
myword->word="*";
return(myword);
break;
case'/':
myword->typenum=16;
myword->word="/";
return(myword);
break;
case':':
m_getch();
if(ch=='=')
{
myword->typenum=18;
myword->word=":=";
return(myword);
}
retract();
myword->typenum=17;
myword->word=":";
return(myword);
break;
case'<':
m_getch();
if(ch=='=')
{
myword->typenum=21;
myword->word="<=";
return(myword);
}
else if(ch=='>')
{
myword->typenum=22;
myword->word="<>";
return(myword);
}
retract();
myword->typenum=20;
myword->word="<";
return(myword);
break;
case'>':
m_getch();
if(ch=='=')
{
myword->typenum=24;
myword->word=">=";
return(myword);
}
retract();
myword->typenum=23;
myword->word=">";
return(myword);
break;
case'=':
myword->typenum=25;
myword->word="=";
return(myword);
break;
case';':
myword->typenum=26;
myword->word=";";
return(myword);
break;
case '(':
myword->typenum=27;
myword->word="(";
return(myword);
break;
case ')':
myword->typenum=28;
myword->word=")";
return(myword);
break;
case '#':
myword->typenum=0;
myword->word="OVER";
return(myword);
break;
case '\0':
myword->typenum=1000;
myword->word="#";
return(myword);
break;
default:
myword->typenum=-1;
myword->word="ERROR";
return(myword);
}
}
}
  
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: