递归下降法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

递归下降分析法
T() { F(); T ( ); } 练习: 编写T’()? T ( ) E → TE' E' → +TE' | ε { if (sym = =‘*’)T → FT ' T ' → *FT ' | ε {GetSym( ); F → (E) | id F(); T ( ); } else if (sym follow(T')) error( ); }
见T
返回E
递归下降分析法
对这个例子,若采用扩充的BNF表示 法改写文法,得到G"[E]: E→E + T |T T→T * F |F F→(E) | id E→ T { +T } T→ F { *F } F→ (E) | id
递归下降分析法
该文法是LL(1)文法,其递归下降分 析程序中主函数和函数F( )同上,对函 数E( )和函数T( )用while语句描述如下:
分析程序中定义两个函数:
(1) 函数 GetSym( ) 功能: 读进源程序的下一个单词符号 并将它放在全程变量sym。
(2) 函数 error( ) 功能: 出错处理程序。
递归下降分析法
对文法G'[E]可写出相应的递归下降分 析程序如下:
E → TE' E' → +TE' | ε T → FT' T' → *FT' | ε F → (E) | id
递归下降分析法
E() { T ( ); while ( sym = =‘+’) { GetSym ( ); T ( ); } } T() { F ( ); while ( sym = =‘*’) { GetSym ( ); F ( ); } } E→ T { +T } T→ F { *F } F→ (E) | id
递归下降分析法
F() E → TE ' { if (sym= = ‘id’) GetSym( ); E ' → +TE ' | ε T → FT ' else if (sym= = ‘(’) T ' → *FT ' | ε { F → (E) | id GetSym( ) ; E ( ); if (sym = = ‘)’ ) GetSym( ); else error ( ); } else error ( );
递归下降分析法
分析 首先消去文法左递归,得到文法 G'[E]
E→E + T |T T→T * F |F F→(E) | id E → TE' E'→ +TE' | ε T → FT' T'→ *FT' | ε F → (E) | id
递归下降分析法
经过验证,文法G'[E]是LL(1)文法。
递归下降分析法
T ( ) follow(T')={+, ), # } { if (sym = =‘*’) { GetSym( ); F(); T ( ); } else if (sym follow(T')) error( ); } 返回T
递归ቤተ መጻሕፍቲ ባይዱ降分析法
E '( ) { if (sym = =‘+’) { GetSym( ); 返回E T(); E ( ); } else if ((sym!=‘)’)&&(sym!=‘#’)) error( );
main( ) { GetSym ( ); E ( ); if (sym= =‘#’) printf (“success”); else printf (“fail”); }
递归下降分析法
E() { T( ); E'( ); }
E → TE' E'( ) E' → +TE' | ε { if (sym = =‘+’) T → FT ' T ' → *FT ' | ε { F → (E) | id GetSym( ); T(); E ( ); } else if ((sym!=‘)’)&&(sym!=‘#’)) error( );
递归下降分析法
基本思想 对文法中的每个非终结符编写一个函 数 (或子程序), 每个函数(或子程序)的 功能是识别由该非终结符所表示的语法成 分。由于描述语言的文法常常是递归定义 的,因此相应的这组函数(或子程序)必 然以相互递归的方式进行调用,所以将此 种分析法称为递归下降分析法。
递归下降分析法
构造递归下降分析程序的方法:
递归下降分析法
id + id #
main( ) { GetSym ( ); E ( ); 见E' if (sym= =‘#’) printf (“success”); else printf (“fail”);返回下一页 }
E() { T( ); E '( ); }
T() { F(); T ( ); } 见F 见T'
为每个非终结符编制一个递归下降 分析函数,每个函数名是相应的非终结 符,函数体则是根据规则右部符号串的 结构和顺序编写。
A→α1α2…αn αi∈VT αi∈VN α1α2…αn=ε
递归下降分析法
(1) 当遇到终结符a时,则编写语句 if (当前读来的输入符号==a) 读下一个输入符号; (2) 当遇到非终结符A时,则编写语句调 用 A( );
递归下降分析法
F() { if (sym= = ‘id’) GetSym( ); else if (sym= = ‘(’) { GetSym( ) ; E ( ); if (sym = = ‘)’ ) GetSym( ); else error ( ); } else error ( );
返回T
递归下降分析法
递归下降分析法
(3) 当遇到规则A→ε 时,则编写语句 if (当前读来的输入符号FOLLOW(A)) error( ); (4) 当某个非终结符的规则有多个候选式 时,按LL(1)文法的条件能唯一地选 择一个候选式进行推导。
递归下降分析法
例 设有文法G[E]: E→ E + T | T T→ T * F | F F→ (E) | id 试构造一个识别该文法句子的递归下 降分析程序。
相关文档
最新文档