編譯原理實驗二遞歸下降分析語法

 產生式如下:

運行結果截圖:

#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);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章