递归下降分析法

一、实验目的及要求

根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。

二、实验设备(环境)及要求

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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章