产生式如下:
运行结果截图:
#include<iostream>
#include<cstring>
using namespace std;
int k;
char sentence[50];
void A(char);
void M(char);
int flag=1;
void A(char ch){
if(ch == '#');
else if(ch == 'a'){
k++;
ch = sentence[k];
M(ch);
}
else if(ch =='e'){
k++;
}
else{
flag =0 ;
}
}
void M(char ch){
if(ch == '#') return;
else if(ch == 'b'||ch == 'd');//从A路分析,当为b或者d时,M当做空处理
else{
ch = sentence[k];
A(ch);
k++;
//cout<<sentence[k]<<endl;
if(sentence[k] == 'd'){//从H路分析
k++;
if(sentence[k] != '#'){
flag=0;
}
}
else{
flag = 0;
}
}
}
void H(char ch){
if(ch == '#') return;
else if(ch == 'a'){
k++;
ch = sentence[k];
M(ch);
//cout<<flag<<endl;
//在M中分析了就不需要在这再写d了
}
else if(ch == 'd'){
k++;
if(sentence[k] != '#'){
flag=0;
}
}
else{
flag = 0;
}
}
void S(char ch){
if(ch == '#');
else if(ch =='a'){
k++;
ch = sentence[k];
H(ch);
}
else {
flag = 0;
}
}
int main(){
do{
cout<<"请输入一个句子,以#结尾"<<endl;
cin>>sentence;
k=0;
flag=1;
S(sentence[k]);
if(flag == 1){
cout<<"是文法给定的句子\n\n";
}
else{
cout<<"不是文法给定的句子\n\n";
}
}while(1);
}