📄 cs.c
字号:
#include "stdio.h"
#include "malloc.h"
void e(); //E
void f(); //F
void t(); //T
void t1(); //T'
void e1(); //E'
char ch;
int Judg; //判断是否为空
struct CSstrchar{
char char_ch;
struct CSstrchar *next;
}CSstrchar,*bb,*cc,*Temp; //输入串结构体定义 链:字符|指针 bb实体指针;cc替换存储
//************************************************************************
void e(void) // E->TE'
{
t();
e1();
}
void t(void)
{
f();
t1(); //T->FT'
}
//*********************************************************************
void e1(void) //E'->+TE'|ε
{
if(bb->char_ch=='+')
{
bb=bb->next;
t();
e1();
}
else
if(bb->char_ch=='#'||bb->char_ch==')')
return;
else
Judg=0;
}
void f()
{
if(bb->char_ch=='i')
bb=bb->next;
else
if(bb->char_ch=='(')
{
bb=bb->next;
e();
if(bb->char_ch==')')
bb=bb->next;
else
Judg=0;
}
else
Judg=0;
}
void t1(void) //T'->*FT'|ε
{
if(bb->char_ch=='*')
{
bb=bb->next;
f();
t1();
}
else
if(bb->char_ch!='#' && bb->char_ch!=')' && bb->char_ch!='+')
Judg=0;
}
//***********************************************************************
void main(void)
{ printf("\n________________________________________________________________________________\n 语法分析器 V1.0\n________________________________________________________________________________\n");
printf("根据文法4.2 :E->E+T|T\n T->T*F|F\n F->(E)|i\n编译以下程序\n");
printf("\n输入一个字符串 :\n例如 :i+i,i*i 并已#号结束\n");
Judg=1;
bb=malloc(sizeof(CSstrchar));
bb->next=NULL;
cc=bb; //bb输入字符串指针 ;cc是替换存储指针;
do{
ch=getchar();
putchar(ch);
if(ch=='i'||ch=='+'||ch=='*'||ch=='('||ch==')'||ch=='#')
{
Temp=malloc(sizeof(CSstrchar));
Temp->next=NULL;
Temp->char_ch=ch;
bb->next=Temp;
bb=bb->next;
}
else
{
Temp=cc->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!='#');
cc=cc->next;
bb=cc;
e();
if(bb->char_ch=='#'&&Judg)
printf("\nOK!\n");
else
printf("\nError!\n");
}
/*文法4.2存在左递归
直接消除左递归后变成:
E->TE'
E'->+TE'|ε
T->FT'
T'->*FT'|ε
F->(E)|i
*/
/*
FIRST(F)={ (,i }
FIRST(T’)={*,ε}
FIRST(T)=FIRST(F)-{ε}={ (,i}
FIRST(E’)={+,ε}
FIRST(E)= FIRST(T)-{ε}={(,i}
∴FIRST(TE’)=FIRST(T)-{ε}={(,i}
FIRST(+TE’)={+} FIRST(ε)={ε}
FIRST(FT’)= FIRST(F)-{ε}={(,i}
FIRST(*FT’)={*} FIRST(ε)={ε}
FIRST((E))={(} FIRST(i)={i}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -