码迷,mamicode.com
首页 > 其他好文 > 详细

词法分析

时间:2015-10-14 21:16:27      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

#include<stdio.h> #include<stdlib.h> #include<string.h> #define _KEY_WOED_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_WOED_END}; //C语言关键字

WORD * scaner(); //词法扫描函数,获得关键字

 

 

main() {  int over=1;  WORD *oneword;  oneword=(WORD *)malloc(sizeof(WORD));  printf("请输入您的字符串(以#作为结束标志):");  scanf("%[^#]s",input);  p_input=0;  printf("您输入的字符串是:%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;  for(i=0;i<7;i++)  {   if(!strcmp(rwtab[i],token))   {    return i+1;   }   i=i+1;  }  return 10; }

 

//回退一个字符 void retract() {  p_input=p_input-1; }

 

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=20;   myword->word=token;   return(myword);  }  else  {   switch(ch)   {   case ‘=‘:m_getch();    if(ch==‘=‘)    {     myword->typenum=39;     myword->word="==";     return(myword);    }    retract();    myword->typenum=21;    myword->word="=";    return(myword);    break;   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 ‘(‘:    myword->typenum=27;    myword->word="(";    return(myword);    break;   case ‘)‘:    myword->typenum=28;    myword->word=")";    return(myword);    break;   case ‘:‘:    myword->typenum=17;    myword->word=":";    return(myword);    break;   case ‘;‘:    myword->typenum=26;    myword->word=";";    return(myword);    break;   case ‘>‘:    myword->typenum=23;    myword->word=">";    return(myword);    break;   case ‘<‘:    myword->typenum=20;    myword->word="<";    return(myword);    break;   case ‘!‘:    m_getch();    if(ch==‘=‘)    {     myword->typenum=40;     myword->word="!=";     return(myword);    }    retract();    myword->typenum=-1;    myword->word="ERROR";    return(myword);    break;   case ‘\0‘:    myword->typenum=1000;    myword->word="OVER";    return(myword);    break;   default:    myword->typenum=-1;    myword->word="ERROR";    return(myword); } } }

 

词法分析

标签:

原文地址:http://www.cnblogs.com/dalaotan/p/4878453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!