递归下降分析

Posted 笑看风云动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归下降分析相关的知识,希望对你有一定的参考价值。

对于给定的文法G[E] :

E→E+T|E-T|T
T→T*F| T/F|F
F→(E)|i

消除左递归后的文法是:
E→TE‘

E‘→+TE‘|-TE‘|∑

T→FT‘

T‘→*FT‘|/FT‘|∑

F→(E)|i

是否是LL(1)文法?

select(E→TE‘)=first(TE‘)={(,i}
select(E‘→+TE‘)=first(+TE‘)={+}
select(E‘→-TE‘)=first(-TE‘)={-}
select(E‘→∑)=follow(E‘)={),#}
select(T→FT‘)=first(FT‘)={(,i}
select(T‘→*FT‘)=first(*FT‘)={*}
select(T‘→/FT‘)=first(/FT‘)={/}
select(T‘→∑)=follow(T‘)={+,-,),#)
select(F→(E))=first((E))={(}
select(F→i)=first(i)={i}

由上分析,得知此文法满足LL(1)文法

 

代码如下

 1 #include<stdio.h>
 2 #include<string>
 3 char str[10];   //记录要分析的字符串
 4 int x=0;        //记录第一个字符
 5  
 6 void E();           
 7 void X();           
 8 void T();           
 9 void Y(); 
10 void F(); 
11  
12 int main()
13 {
14     int len;
15     printf("请输入算数表达式:");
16     scanf("%s",str);
17     len=strlen(str);
18     str[len]=#;
19     str[len+1]=\0;
20     E();
21     printf("\n正确!\n");
22     strcpy(str,"");
23     x=0;
24     return 0;
25 }
26  
27 void E()
28 {
29     T();
30     X();
31 }
32  
33 void X()
34 {
35     if(str[x]==+||str[x]==-)
36     {
37         x++;
38         T();
39         X();
40     } 
41 }
42  
43 void T()
44 {
45     F();
46     Y();
47 }
48  
49 void Y()
50 {
51     if(str[x]==*||str[x]==/)
52     {
53         x++;
54         F();
55         Y();
56     }
57 }
58  
59 void F()
60 {
61     if(str[x]>=a&&str[x]<=z)
62     {
63         x++;
64     }
65     else if(str[x]>=0&&str[x]<=9)
66     {
67         x++;
68     }
69     else if (str[x]==()
70     {     
71         x++;
72         E();
73         if(str[x]==))
74         {
75             x++; 
76         }
77         else
78         {
79             printf("\n错误!\n");
80             exit(0);
81         }
82     } 
83     else
84     {
85         printf("\n错误r!\n"); 
86 exit(0);
87  }
88  }

 

以上是关于递归下降分析的主要内容,如果未能解决你的问题,请参考以下文章

递归下降分析-实验报告

软件构造——递归下降分析法

软件构造实验三-递归下降分析分析法

递归下降分析程序

递归下降分析程序

递归下降分析法