📄 dgxj.cpp
字号:
/************************************************************************************************
文法G:E->TE'
E'->+E/ε
T->FT'
T'->T/ε
F->PF'
F'->*F'/ε
P->(E)/a/b/^
************************************************************************************************/
#include "stdio.h"
#include "string"
/***************************初始化非终结符子程序***********************************************/
void E(); /*非终结符E的子程序*/
void Ee(); /*非终结符E'的子程序*/
void T(); /*非终结符T的子程序*/
void Tt(); /*非终结符T'的子程序*/
void F(); /*非终结符F的子程序*/
void Ff(); /*非终结符F'的子程序*/
void P(); /*非终结符P的子程序*/
/**********************************************************************************************/
char FIRST_T[5]="(ab^";
char FOLLOW_Ee[3]=")#";
char FIRST_F[5]="(ab^";
char FOLLOW_Tt[8]="(ab^+)#";
char FIRST_P[5]="(ab^";
char FOLLOW_Ff[9]="*(ab^+)#";
/**********************************************************************************************/
char ch; /*存放当前的输入符号*/
char SS[50];
int length,count=0;
int sign;
void E()
{
if(strchr(FIRST_T,SS[count])) /*FIRST_T为E->TE' 的右部的FIRST集合*/
{
printf("E->TE'\n");
T();
Ee(); printf("E->TE'\n");
}
else
{sign=0;printf("ERROR:无适合的E推出式'\n");}
}
void Ee()
{
if(SS[count]=='+')
{
printf("E'->+E\n");
count++;
printf("剩余字符为:");
for(int k=count;k<length;k++)
printf("%c",SS[k]);
printf("\n");
E();
}
else if(strchr(FOLLOW_Ee,SS[count])) /*产生式E'->ε FOLLOW_Ee为E'的FOLLOW集合*/
printf("E'->ε\n");
else
{sign=0;printf("ERROR:无适合的E'推出式\n");}
}
void T()
{
if(strchr(FIRST_F,SS[count])) /*FIRST_F为T->FT' 的右部的FIRST集合*/
{
printf("T->FT'\n");
F();
Tt();
}
else
{sign=0;printf("ERROR:无适合的T推出式\n");}
}
void Tt()
{
if(strchr(FIRST_T,SS[count])) /*FIRST_T为产生式T'->T 的右部的FIRST集合*/
{
printf("T'->T\n");
T();
}
else if(strchr(FOLLOW_Tt,SS[count])) /*产生式T'->ε,FOLLOW_Tt为T'的FOLLOW集合*/
printf("T'->ε\n");
else
{sign=0;printf("ERROR:无适合的T'推出式\n");}
}
void F()
{
if(strchr(FIRST_P,SS[count])) /*FIRST_P为F->PF' 的右部的FIRST集合*/
{ printf("F->PF'\n");
P();
Ff();
}
else
{sign=0;printf("ERROR:无适合的F推出式\n");}
}
void Ff() /*非终结符F'的子程序*/
{
if(SS[count]=='*') /* 产生式F'->*F' */
{
printf(" F'->*F'\n");
count++;
printf("剩余字符为:");
for(int k=count;k<length;k++)
printf("%c",SS[k]);
printf("\n");
Ff();
}
else if(strchr(FOLLOW_Ff,SS[count])) /*产生式F'->ε FOLLOW_Ff为F'的FOLLOW集合*/
printf(" F'->ε\n");
else
{sign=0;printf("ERROR:无适合的F'推出式\n");}
}
void P()
{
if(SS[count]=='(')
{
printf("P->(E)\n");
count++;
printf("剩余字符为:");
for(int k=count;k<length;k++)
printf("%c",SS[k]);
printf("\n");
E();
if(SS[count]==')')
{
printf("P->(E)\n");
count++;
printf("剩余字符为:");
for(int k=count;k<length;k++)
printf("%c",SS[k]);
printf("\n");
}
}
else if(SS[count]=='a')
{
printf("P->a\n");
count++;
printf("剩余字符为:");
for(int k=count;k<length;k++)
printf("%c",SS[k]);
printf("\n");
}
else if(SS[count]=='b')
{
printf("P->b\n");
count++;
printf("剩余字符为:");
for(int k=count;k<length;k++)
printf("%c",SS[k]);
printf("\n");
}
else if(SS[count]=='^')
{
printf("P->^\n");
count++;
printf("剩余字符为:");
for(int k=count;k<length;k++)
printf("%c",SS[k]);
printf("\n");
}
else
{sign=0;printf("ERROR:无适合的P推出式\n");}
}
void main()
{
length=0;
sign=1;
printf("请输入要分析的字符串,并以#结束: \n");
do{
scanf("%c",&ch);
SS[length]=ch;
length++;
}while(ch!='#');
E();
if(SS[count]==SS[length-1]&&sign)
printf("分析成功\n");
else
printf("分析失败\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -