递归下降法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 设有文法G[E]: E→ E + T | T T→ T * F | F F→ (E) | id
试构造一个识别该文法句子的递归下 降分析程序。
递归下降分析法
分析 首先消去文法左递归,得到文法 G'[E]
E→E + T |T T→T * F |F
F→(E) | id
E → TE' E'→ +TE' | ε T → FT' T'→ *FT' | ε F → (E) | id
T( ); E'( ); }
E'( )
E → TE'
{
E' → +TE' | ε
if (sym = =‘+’) {
GetSym( );
T → FT ' T ' → *FT ' | ε
F → (E) | id
T();
E ( );
}
else if ((sym!=‘)’)&&(sym!=‘#’))
error( );
递归下降分析法
递归下降分析法是确定的自上 而下分析法,这种分析法要求文 法是LL(1)文法。
递归下降分析法
基本思想 对文法中的每个非终结符编写一个函
数 (或子程序), 每个函数(或子程序)的 功能是识别由该非终结符所表示的语法成 分。由于描述语言的文法常常是递归定义 的,因此相应的这组函数(或子程序)必 然以相互递归的方式进行调用,所以将此 种分析法称为递归下降分析法。
F→ (E) | id
递归下降分析法
该文法是LL(1)文法,其递归下降分 析程序中主函数和函数F( )同上,对函 数E( )和函数T( )用while语句描述如下:
递归下降分析法
E() {
T ( );
T() {
F ( );
E→ T { +T } T→ F { *F }
F→ (E) | id
while ( sym = =‘+’) while ( sym = =‘*’)
else printf (“fail”); 返回下一页 见T' }
递归下降分析法
F() {
if (sym= = ‘id’) GetSym( ); else if (sym= = ‘(’) {
GetSym( ) ; E ( ); if (sym = = ‘)’ ) GetSym( ); else error ( ); } else error ( ); }
(2) 当遇到非终结符A时,则编写语句调 用 A( );
递归下降分析法
(3) 当遇到规则A→ε 时,则编写语句 if (当前读来的输入符号FOLLOW(A)) error( );
(4) 当某个非终结符的规则有多个候选式 时,按LL(1)文法的条件能唯一地选 择一个候选式进行推导。
递归下降分析法
else error ( );
}
else error ( );
}
递归下降分析法
id + id # E ( )
T()
{
{
main( ) { GetSym ( );
T( ); E '( ); }
F(); T ( ); }
E ( ); if (sym= =‘#’)
见E'
见F
printf (“success”);
{
{
GetSym ( );
GetSym ( );
T ( );
F ( );
}
}
}
}
递归下降分析法
优点: 递归下降分析法简单、直观,易 于构造分析程序。
缺点: 对文法要求高,必须是LL(1)文 法,同时由于递归调用较多,影 响分析器的效率。
E → TE' E' → +TE' | ε
main( ) { GetSym ( );
T → FT' T' → *FT' | ε
F → (E) | id
E ( ); if (sym= =‘#’) printf (“success”); else printf (“fail”);
}
递归下降分析法
E() {
}
递归下降分析法
T() {
F(); T ( ); }
练习: 编写T’()?
T ( )
E → TE'
{
E' → +TE' | ε
if (sym = =‘*’) T → FT '
{GetSym( );
T ' → *FT ' | ε
F();
F → (E) | id
T ( );
}
else if (sym follow(T'))
返回T
递归下降分析法
T ( ) {
follow(T')={+, ), # }
if (sym = =‘*’)
{ GetSym( );
F();
T ( );
}
else if (sym follow(T'))
error( );
}
返回T

递归下降分析法
E '( )
{
if (sym = =‘+’)
{
GetSym( ); 返回E
T();
见T
E ( );
}
else if ((sym!=‘)’)&&(sym!=‘#’))
error( ); }
返回E
递归下降分析法
对这个例子,若采用扩充的BNF表示 法改写文法,得到G"[E]:
E→E + T |T T→T * F |F
F→(E) | id
E→ T { +T } T→ F { *F }
递归下降分析法
构造递归下降分析程序的方法:
为每个非终结符编制一个递归下降
分析函数,每个函数名是相应的非终结
符,函数体则是根据规则右部符号串的
结构和顺序编写。
A→α1α2…αn αi∈VT αi∈VN α1α2…αn=ε
递归下降分析法
(1) 当遇到终结符a时,则编写语句 if (当前读来的输入符号==a) 读下一个输入符号;
error( );
}
递归下降分析法
F()
{
E → TE '
if (sym= = ‘id’) GetSym( ); E ' → +TE ' | ε
else if (sym= = ‘(’) {
GetSym( ) ;
T → FT ' T ' → *FT ' | ε
F → (E) | id
E ( );
if (sym = = ‘)’ ) GetSym( );
递归下降分析法
经过验证,文法G'[E]是LL(1)文法。
递归下降分析法
分析程序中定义两个函数:
(1) 函数 GetSym( ) 功能: 读进源程序的下一个单词符号 并将它放在全程变量sym。
(2) 函数 error( ) 功能: 出错处理程序。
递归下降分析法
对文法G'[E]可写出相应的递归下降分 析程序如下:
相关文档
最新文档