主题:递归下降语法分析器
递归下降语法分析器
/************************************/
/* 程序名称: 递归下降语法分析器 */
/* 程序用途: 编译原理实验(二) */
/* 编写日期: 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();
}
/************************************/
/* 程序名称: 递归下降语法分析器 */
/* 程序用途: 编译原理实验(二) */
/* 编写日期: 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();
}