www.pudn.com > dgxjyffxq.rar > dgxjyffxq.cpp


/************************************/ 
/* 程序名称: 递归下降语法分析器 */ 
/* 程序用途: 编译原理实验(二) */ 
/* 编写日期: 2005年11月1日  */ 
/* 实验题目: 识别下列表达式  */ 
/*    E->E+T|T   */ 
/*    T->T*F|F   */ 
/*    F->(E)|i   */ 
/* 程序版本: 1.0 Final   */ 
/* 程序作者: JOHN B0226047  */ 
/************************************/ 
 
#i nclude "stdio.h" 
#i nclude "malloc.h" 
 
void e(); 
void f(); 
void t(); 
void t1(); 
void e1(); 
 
struct Lchar{ 
 char char_ch; 
 struct Lchar *next; 
}Lchar,*p,*h,*temp; 
char ch; 
int right; 
 
void e(void) 
{ 
 t(); 
 e1(); 
} 
 
void t(void) 
{ 
 f(); 
 t1(); 
} 
 
void t1(void) 
{ 
 if(h->char_ch=='*') 
 { 
  h=h->next; 
  f(); 
  t1(); 
 } 
 else 
  if(h->char_ch!='#'&&h->char_ch!=')'&&h->char_ch!='+') 
   right=0; 
} 
 
void e1(void) 
{ 
 if(h->char_ch=='+') 
 { 
  h=h->next; 
  t(); 
  e1(); 
 } 
 else 
  if(h->char_ch=='#'||h->char_ch==')') 
   return; 
  else 
   right=0; 
} 
 
void f() 
{ 
 if(h->char_ch=='i') 
  h=h->next; 
 else 
  if(h->char_ch=='(') 
  { 
   h=h->next; 
   e(); 
   if(h->char_ch==')') 
    h=h->next; 
   else 
    right=0; 
  } 
  else 
   right=0; 
} 
 
void main(void) 
{ 
 right=1; 
 h=malloc(sizeof(Lchar)); 
 h->next=NULL; 
 p=h; 
 do{ 
  ch=getch(); 
  putch(ch); 
  if(ch=='i'||ch=='+'||ch=='*'||ch=='('||ch==')'||ch=='#') 
  { 
   temp=malloc(sizeof(Lchar)); 
   temp->next=NULL; 
   temp->char_ch=ch; 
   h->next=temp; 
   h=h->next; 
  } 
  else 
  { 
   temp=p->next; 
   printf("\nInput a wrong char!Input again:\n"); 
   for(;;) 
   {     
    if (temp!=NULL) 
     printf("%c",temp->char_ch);       
    else 
     break; 
    temp=temp->next; 
   } 
  } 
 }while(ch!='#'); 
 p=p->next; 
 h=p; 
 e(); 
 if(h->char_ch=='#'&&right) 
  printf("\nOK!\n"); 
 else 
  printf("\nError!\n"); 
 getchar(); 
}