- 1
- 0
- 约9.79千字
- 约 43页
- 2018-10-19 发布于山东
- 举报
主要内容
自顶向下分析概述
递归下降分析算法
First 集合和Follow集合
LL(1)分析
TINY语言的递归下降分析程序
自顶向下分析程序中的错误校正
• 试编写分析如下文法所对应任意串(如efbaefb )
的递归下降分析程序。
G[S]={S→AB
A→Ba
B→Cb
C→ef}
void S(void)//规则S→AB
{
A( );
B( );
} //S
void A(void)//规则A→Ba
{
B( );
match(‘a’);
} //A
void B(void)//规则B→Cb
{
C( );
match(‘b’);
} //B
void C(void)//规则C→ef
{
match(‘e’);
match(‘f’);
} //C
例如分析串efbaefb 。由于效率低,因此调用前先找出A开头的符号。
void S(void)//规则S→AB
{
if (token == A开头的符号){
A( );
B( );}
} //S
void A(void)//规则A→Ba
{
B( );
match(‘a’);
} //A
void B(void)//规则B→Cb
{
C( );
match(‘b’);
} //B
void C(void)//规则C→ef
{
match(‘e’);
match(‘f’);
} //C
• 试编写分析如下文法所对应任意串(如
acefbgh )的递归下降分析程序。
G[S]={S→AB|CD
A→aB|dD
B→cC|bD
C→ef|gh
D→i|j}
void S(void)//规则S→AB|CD
{
if (token == ?)
{
A( );
B( );
}
else if (token == ?)
{
C( );
D( );
}
else error( );
} //S
void S(void)//规则S→AB|CD
{
if (token == A开头的符号)
{
A( );
B( );
}
else if (token == C开头的符号)
{
C( );
D( );
}
else error( );//出错处理函数
} //S
先找出A或C开头的终结符号
• 总结
(1)为提高效率
(2 )解决诸如S→AB|CD 的选择问题
有必要求出每一条规则的开头的非终结符
号的所有打头终结符号。这就涉及如何求
解First集合?一般使用归纳法。
• 情况1:
G[S]={S→AB
A→Ba
原创力文档

文档评论(0)