递归下降语法分析器 
/************************************/
/* 程序名称: 递归下降语法分析器 */
/* 程序用途: 编译原理实验(二) */
/* 编写日期: 2005年11月1日  */
/* 实验题目: 识别下列表达式  */
/*    E->E+T|T   */
/*    T->T*F|F   */
/*    F->(E)|i   */
/* 程序版本: 1.0 Final   */
/************************************/
#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();
}