然后就是, 递归下降分析算法(也算是自顶向下分析算法的一个子类(也算是改进))...
然后给出伪代码 ...
然而想象是美好的, 现实是残酷的 :
如上图, 真正要实现的时候却又遇到了问题, 那就是, 当读入第一个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 }
浙公网安备 33010602011771号