?? dgxj.cpp
字號(hào):
/************************************************************************************************
文法G:E->TE'
E'->+E/ε
T->FT'
T'->T/ε
F->PF'
F'->*F'/ε
P->(E)/a/b/^
************************************************************************************************/
#include "stdio.h"
#include "string"
/***************************初始化非終結(jié)符子程序***********************************************/
void E(); /*非終結(jié)符E的子程序*/
void Ee(); /*非終結(jié)符E'的子程序*/
void T(); /*非終結(jié)符T的子程序*/
void Tt(); /*非終結(jié)符T'的子程序*/
void F(); /*非終結(jié)符F的子程序*/
void Ff(); /*非終結(jié)符F'的子程序*/
void P(); /*非終結(jié)符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; /*存放當(dāng)前的輸入符號(hào)*/
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:無(wú)適合的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])) /*產(chǎn)生式E'->ε FOLLOW_Ee為E'的FOLLOW集合*/
printf("E'->ε\n");
else
{sign=0;printf("ERROR:無(wú)適合的E'推出式\n");}
}
void T()
{
if(strchr(FIRST_F,SS[count])) /*FIRST_F為T(mén)->FT' 的右部的FIRST集合*/
{
printf("T->FT'\n");
F();
Tt();
}
else
{sign=0;printf("ERROR:無(wú)適合的T推出式\n");}
}
void Tt()
{
if(strchr(FIRST_T,SS[count])) /*FIRST_T為產(chǎn)生式T'->T 的右部的FIRST集合*/
{
printf("T'->T\n");
T();
}
else if(strchr(FOLLOW_Tt,SS[count])) /*產(chǎn)生式T'->ε,FOLLOW_Tt為T(mén)'的FOLLOW集合*/
printf("T'->ε\n");
else
{sign=0;printf("ERROR:無(wú)適合的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:無(wú)適合的F推出式\n");}
}
void Ff() /*非終結(jié)符F'的子程序*/
{
if(SS[count]=='*') /* 產(chǎn)生式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])) /*產(chǎn)生式F'->ε FOLLOW_Ff為F'的FOLLOW集合*/
printf(" F'->ε\n");
else
{sign=0;printf("ERROR:無(wú)適合的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:無(wú)適合的P推出式\n");}
}
void main()
{
length=0;
sign=1;
printf("請(qǐng)輸入要分析的字符串,并以#結(jié)束: \n");
do{
scanf("%c",&ch);
SS[length]=ch;
length++;
}while(ch!='#');
E();
if(SS[count]==SS[length-1]&&sign)
printf("分析成功\n");
else
printf("分析失敗\n");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -