概述
作业用的简化版递归下降识别器 :
例子说明:
文法G[S]:
S-> A|B
A->aM
M->A|#
B->bN
N->B|#
①文法不含左递归
| 是否=># | First | follow |
S | 否 | {a,b} | # |
A | 否 | {a} | # |
B | 否 | {b} | # |
M | 是 | {a,#} | # |
N | 是 | {b,#} | # |
①文法不含左递归
②M N的产生式至多有一个#,因此:
First(A) ∩ follow(M) = ∅
First(B) ∩ follow{N} = ∅
③S A B的产生式没有#, 因此
First(A) ∩first(B) = ∅
First{aM}={a}
First{bN} ={b}
因此此文法符合LL(1)判断
递归下降分析:
Select(S->A) = {a}
Select(S->B)={b}
Select(A->aM)={a}
Select(M->A)={a)
Selec(M->#)=(#)
Select(B->bN)={b}
Select(N->B)={b}
Select(N->#)={#}
Void praseS(){
Switc(lookahead){
Case a:
ParseA();
Break;
Case b:
ParseB();
Break;
Defalut:
Print(“error”);
Exit();
}
}
Void praseA(){
Switc(lookahead){
Case a:
MatchToken(a)
ParseM();
Break;
Defalut:
Print(“error”);
Exit();
}
}
Void praseB(){
Switc(lookahead){
Case b:
MatchToken(b)
ParseN();
Break;
Defalut:
Print(“error”);
Exit();
}
}
Void praseM(){
Switc(lookahead){
Case a:
ParseA();
Break;
Case #:
MatchToken(#)
Break;
Defalut:
Print(“error”);
Exit();
}
}
Void praseN(){
Switc(lookahead){
Case b:
ParseB();
Break;
Case #:
MatchToken(#)
Break;
Defalut:
Print(“error”);
Exit();
}
}
最后
以上就是舒心大侠为你收集整理的递归下降识别器——编译原理的全部内容,希望文章能够帮你解决递归下降识别器——编译原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复