然后就是, 递归下降分析算法(也算是自顶向下分析算法的一个子类(也算是改进))...

 

然后给出伪代码 ...

 

然而想象是美好的, 现实是残酷的 :

 

如上图, 真正要实现的时候却又遇到了问题, 那就是, 当读入第一个token时(此处显然是num), 发现无论是 E + T 和 T 都是可行的, 所以这边又遇到了问题...但是这种情况有时可以利用文法的特殊性来避免 :

在 这个例子中 E最终无非是 T + T + T + ... 的格式, 而T 则是 F * F * F * ... 的格式, 那么完全可以在读入3之后先调用parse_T(), 再读入一个token, 若是 +, 则调用 parse_T(), 若不是, 则停止调用...

接下来是一个小作业 :

递归下降分析算法

给定如下的文法G:

A -> a B

      | a

B -> b

      | c

假定你正在给这个文法写一个递归下降分析算法,请给出该算法的递归下降分析算法。你遇到了什么困难?你如何解决这些困难?

这个很简单, 依葫芦画瓢, 伪代码如下

 

 1 parse_A(){
 2     token = tokens[i++];
 3     if(token == a){
 4         token = tokens[i++];
 5         if(token == EOF){
 6             return;
 7         }else{
 8             parse_B()
 9         }
10     }else{
11         error(...);
12     }
13 }
14 
15 parse_B(){
16     token = tokens[i++];
17     if(token == b){
18         ...
19     }else if(token == c){
20         ...
21     }else{
22         error(...);
23     }
24 }

 

 

posted on 2016-05-12 13:51  内脏坏了  阅读(268)  评论(0编辑  收藏  举报