词法分析程序


必须以空格/回车 Tab 回车键 结束
疑难问题,至今还未解决:
http://www/uc/myshow/blog/misc/gif/E___7403ZH00SIGG.gif case中
空格,回车字符 怎么识别http://www/uc/myshow/blog/misc/gif/E___6782EN00SIGG.gif
http://www/uc/myshow/blog/misc/gif/E___6782EN00SIGG.gif

本来定义的以Tab键结束输入,为什么在Tab键前必须输入空格键或回车键,否则最后一个字符串一般会出错http://www/uc/myshow/blog/misc/gif/E___6782EN00SIGG.gif
标识符由字母数字下划线组成,且不以数字开头。
字符串(编码):
include(1)
void(2)
main(3)
float(4)
char(5)
int(6)
string(7) for(8)
while(9)
if(10)
else(11)
scanf(12)
printf(13)
break(14) continue(15)
return(16)
define(17)
typedef(18)
struct(19)
switch(20) case(21)
sixeof(22)
default(23) 数字(24) 标识符(25) ( (31) )
(32) [
(33) .
(34) ]
(35) %
(36) ,
(37) ;
(38) #
(39) '
(40) {
(41) "
(42) :
(43) }
(44) !=
(45) !
(46) ++
(47) +=
(48) +
(49) --
(50) -=
(51) ->(
52) -
(53) */
(54) *=
(55) *
(56)
#include<stdio.h>
#include<string.h>
#define LIST_INIT_SIZE 500
#define LISTINCREMENT 100
int k=0;//用于为无法识别的字符计数
char f[100];//用于暂时保存无法识别的字符
typedef struct { char *elem;
int length;
int listsize;
}sqlist;
typedef struct LNode { char key[20];
int number;
struct LNode *next;
} LNode, *linklist;
//顺序表的初始化
void Initlist_sq(sqlist *l)
{
l->elem=(char*)malloc(LIST_INIT_SIZE*sizeof(char));
/
/ if(!l->elem)
exit(OVERFLOW);
l->length=0;
l->listsize=LIST_INIT_SIZE;
}
//顺序表的建立,并输入数据,暂时存放输入的待分析的程序代码
void listinsert_sq(sqlist *l)
{ int i=0;
char e;
scanf("%c",&e);
while(e!='\t')
{//if(l->length>=l->listsize)
//
newbase=(char*)realloc(l->elem,(l->listsize+LISTINCREMENT)*sizeof(char));
// l->elem=newbase;
l->elem[i]=e;
l->length++;
i++;
scanf("%c",&e);
}
}
//单链表的建立,存放关键字
int createlist_l(linklist l)
{ linklist
p,q;
int i;
q=l;
for(i=1;i<=23;i++)
{ p=(linklist)malloc(sizeof(LNode));
p->next=NULL;
switch(i)
{ case 1:strcpy(p->key,"include");break;
case 2:strcpy(p->key,"void");break;
case 3:strcpy(p->key,"main");break;
case 4:strcpy(p->key,"float");break;
case 5:strcpy(p->key,"char");break;
case 6:strcpy(p->key,"int");break;
case 7:strcpy(p->key,"string");break;
case 8:strcpy(p->key,"for");break;
case 9:strcpy(p->key,"while");break;
case 10:strcpy(p->key,"if");break;
case 11:strcpy(p->key,"else");break;
case 12:strcpy(p->key,"scanf");break;
case 13:strcpy(p->key,"printf");break;