遞歸下降分析法

一、實驗目的及要求

根據某一文法編制調試遞歸下降分析程序,以便對任意輸入的符號串進行分析。本次實驗的目的主要是加深對遞歸下降分析法的理解。

二、實驗設備(環境)及要求

PC機及vc6.0軟件及環境

三、實驗內容與步驟

  1.實驗內容:

對下列文法,用遞歸下降分析法對任意輸入的符號串進行分析:

(1)E->TG

(2)G->+TG|-TG

(3)G->ε

(4)T->FS

(5)S->*FS|/FS

(6)S->ε

(7)F-> (E)

(8)F->i

編寫相應的程序,實現上述功能。

   2.實驗步驟:

  (1)根據文法編寫相應的函數,如E(),G()等函數,並且每個函數都用全局變量temp的相應值表示其在文法中的位置。

  (2)編寫error()函數,當與文法不匹配時,打印出錯誤信息,並用exit(0)退出。

  (3)編寫output()函數:根據定義的全局變量temp值得出當前分析的串的所處的文法位置,並將其打印出來,接着將分析串、分析字符、剩餘串打印出來。

   (4)編寫main():用word來存儲要分析的串(以“#”結束),用循環對每個字符進行分析。

四、實驗結果與數據處理

   1.串:i+i*i#

     結果:

 

 

 

 

 

 

   2.串:i*i++i#      結果:出現錯誤。

 

 

 

五、代碼清單

#include<stdio.h>

#include<string.h>

void E();

void G();

void T();

void S();

void F();

void error();

void output(int count);

 

char word[50];

int i = 0;

int temp = 0;

char analysisw[50];

int main()

{

       printf("請輸入字符串(長度<50,以#號結束):\n");

       scanf("%s",word);

       printf("%-10s %-20s %-10s %-10s\n","文法","分析串","分析字符","剩餘串");

       while(word[i] != '#')

       {

               E();

       }

      

       return 0;

}

 

void E()

{

       temp = 1;

       output(i);

       T();

       G();

}

 

void G()

{

       temp = 2;

       if(word[i] == '+')

       {

               analysisw[i] = word[i];

               output(i+1);

               i++;

               T();

               G();

       }

       else if(word[i] == '-')

       {

               analysisw[i] = word[i];

               output(i+1);

               i++;

               T();

               G();

       }

       else

       {

               temp = 3;

               output(i);

       }

}

 

void T()

{

       temp = 4;

       output(i);

       F();

       S();

}

 

void S()

{

       temp = 5;

       if(word[i] == '*')

       {

               analysisw[i] = word[i];

               output(i+1);

               i++;

               F();

               S();

       }

       else if(word[i] == '/')

       {

               analysisw[i] = word[i];

               output(i+1);

               i++;

               F();

               S();

       }

       else

       {

               temp = 6;

               output(i);

       }

}

 

void F()

{

       if(word[i] == '(')

       {

               analysisw[i] = word[i];

               temp = 7;

               output(i+1);

               i++;

               E();

               if(word[i] == ')')

               {

                      analysisw[i] = word[i];

                      temp = 7;

                      output(i+1);

                      i++;

               }

               else

               {

                      error();

               }

       }

       else if(word[i] == 'i')

       {

               analysisw[i] = word[i];

               temp = 8;

               output(i+1);

               i++;

       }

       else

       {

               error();

       }

              

}

 

void error()

{

       strcpy(analysisw, "analysis error");

       output(i);

       exit(0);

}

 

void output(int count)

{

       switch(temp)

       {

               case 1:

                      printf("%-10s","E->TG");

                      break;

               case 2:

                      printf("%-10s","G->+TG|-TG");

                      break;

               case 3:

                      printf("%-10s","G->ε");

                      break;

               case 4:

                      printf("%-10s","T->FS");

                      break;

               case 5:

                      printf("%-10s","S->*FS|/FS");

                      break;

               case 6:

                      printf("%-10s","S->ε");

                      break;

               case 7:

                      printf("%-10s","F-> (E)");

                      break;

               case 8:

                      printf("%-10s","F->i");

                      break;

       }

       printf(" %-20s %-10c ",analysisw,word[i]);

       for(;word[count] != '\0';count++)

       {

               printf("%c",word[count]);

       }

       printf("\n");

}

發佈了32 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章