LL1 First GS 1S AB 2A Da 3B
LL(1) 分析 《编译原理》 ² 例:计算 First 集合 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First(S) = { } First(A) = { } First(B) = { } First(C) = { } First(D) = { } First(a) = {a} First(b) = {b} First(c) = {c} First( ) = { } First(AB) = { } First(Da) = { } First(c. C) = { } First(a. ADC) = { }
LL(1) 分析 《编译原理》 ² 例:计算 First 集合( 续) 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First(S) = { } First(A) = { } First(B) = { } First(C) = { } First(D) = { , b} First(a) = {a} First(b) = {b} First(c) = {c} First( ) = { } First(AB) = { } First(Da) = { } First(c. C) = { } First(a. ADC) = { }
LL(1) 分析 《编译原理》 ² 例:计算 First 集合( 续) 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First(S) = { } First(A) = { } First(B) = { } First(C) = { } First(D) = { , b} First(a) = {a} First(b) = {b} First(c) = {c} First( ) = { } First(AB) = { } First(Da) = {a, b} First(c. C) = {c } First(a. ADC) = {a }
LL(1) 分析 《编译原理》 ² 例:计算 First 集合( 续) 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First(S) = { } First(A) = { , a, b} First(B) = {c} First(C) = {a, } First(D) = { , b} First(a) = {a} First(b) = {b} First(c) = {c} First( ) = { } First(AB) = { } First(Da) = {a, b} First(c. C) = {c } First(a. ADC) = {a }
LL(1) 分析 《编译原理》 ² 例:计算 First 集合( 续) 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First(S) = { } First(A) = { , a, b} First(B) = {c} First(C) = {a, } First(D) = { , b} First(a) = {a} First(b) = {b} First(c) = {c} First( ) = { } First(AB) = {a, b, c} First(Da) = {a, b} First(c. C) = {c} First(a. ADC) = {a}
LL(1) 分析 《编译原理》 ² 例:计算 First 集合( 续) 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First(S) = {a, b, c } First(A) = { , a , b} First(B) = {c} First(C) = {a, } First(D) = { , b} First(a) = {a} First(b) = {b} First(c) = {c} First( ) = { } First(AB) = {a, b, c} First(Da) = {a, b} First(c. C) = {c} First(a. ADC) = {a}
LL(1) 分析 《编译原理》 ² 例:计算 First 和 Follow 集合 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b Follow(S) = {#} Follow(A) = { } Follow(B) = { } Follow(C) = { } Follow(D) = { } S AB中帮助 计算Follow(A) First(B) = {c} First( ) = { } First(a) = {a} First(DC) = {b, a, } First(C) = {a, } S AB看成S AB , 帮助计算Follow(B)
LL(1) 分析 《编译原理》 ² 例:计算 First 和 Follow 集合 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b Follow(S) = {#} Follow(A) = { } Follow(B) = { } Follow(C) = { } Follow(D) = { } First(B) = {c} First( ) = { } First(a) = {a} First(DC) = {b, a, } First(C) = {a, } Follow(A) = {c} Follow(B) = {#}
LL(1) 分析 《编译原理》 ² 例:计算 First 和 Follow 集合 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b Follow(S) = {#} Follow(A) = {c} Follow(B) = {#} Follow(C) = { } Follow(D) = { } First(B) = {c} First( ) = { } First(a) = {a} First(DC) = {b, a, } First(C) = {a, } Follow(D) = {a}
LL(1) 分析 《编译原理》 ² 例:计算 First 和 Follow 集合 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b Follow(S) = {#} Follow(A) = {c} Follow(B) = {#} Follow(C) = { } Follow(D) = {a} First(B) = {c} First( ) = { } First(a) = {a} First(DC) = {b, a, } First(C) = {a, } Follow(C) = {#}
LL(1) 分析 《编译原理》 ² 例:计算 First 和 Follow 集合 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First(B) = {c} First( ) = { } First(a) = {a} First(DC) = {b, a, } First(C) = {a, } Follow(S) = {#} Follow(A) = {c, b, a, #} Follow(A) = {c} Follow(B) = {#} Follow(C) = {#} Follow(D) = {a, #}
LL(1) 分析 《编译原理》 ² 例:计算 First 和 Follow 集合 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b Follow(S) = {#} Follow(A) = {c, b, a, #} Follow(B) = {#} Follow(C) = {#} Follow(D) = {a, #} First(B) = {c} First( ) = { } First(a) = {a} First(DC) = {b, a, } First(C) = {a, }
LL(1) 分析 《编译原理》 ² 举例:验证如下文法 G(S)不是 LL(1)文法 文法 G(S): (1)S AB (2)A Da (3)B c. C (4)C a. ADC (5)D b First( ) = { } First(Da) = {b, a} First(a. ADC) = {a} First(b) = {b} Follow(A) = {c, b, a, #} Follow(C) = {#} Follow(D) = {a, #} Select(A Da) = {b, a} Select(A ) = {c, b, a, #} Select(C a. ADC) = {a} Select(C ) = {#} Select(D b) = {b} Select(D ) = {a, #} Select(A Da) Select (A ) Select(C a. ADC ) Select (C ) = Select(D b) Select (D ) =
递归下降 LL(1)分析程序 《编译原理》 ² 非终结符对应的递归下降子程序 - 例 对于下列关于 function 的唯一产生式 <function> FUNC ID ( <parameter_list> ) <statement> 其中<function>,<parameter_list>和 <statement> 是非终结符。 void Parse. Function() { Match. Token(T_FUNC); //匹配FUNC Match. Token(T_ID); //匹配ID Match. Token(T_LPAREN); // 匹配“(” Parse. Parameter. List(); Match. Token(T_RPAREN); // 匹配“)” Parse. Statement(); } void Match. Token(int expected) //处理终结符, { if (lookahead != expected) //判别当前单词lookahead是否与 { //期望的终结符匹配 printf("syntax error n"); exit(0); } else // 若匹配, 消费掉当前单词并读入下一个 lookahead = get. Token(); //调用词法分析程序 }
递归下降 LL(1)分析程序《编译原理》 ² 递归下降LL(1)分析程序举例 - 例 对于下列文法 G(S): S Aa. S Bb. S d A a B c Select(S Aa. S) = {a} Select(S Bb. S) = {c, b} Select(S d) = {d} Select(A a) = {a} Select(B ) = {b} Select(B c) = {c} First(Aa. S)= {a} First(Bb. S)= {c, b} First(d)= {d} First(a)= {a} First( )= { } First(c)= {c} Follow(S)= {#} Follow(A)= {a} Follow(B)= {b} Select(S Aa. S),Select (S Bb. S) 以及 Select (S d) 互不 相交, Select (B ) 和 Select (B c)互不相交,所以,G(S) 是 LL(1) 文法
递归下降 LL(1)分析程 序 void Parse. A() ² 非终结符对应的 递归下降子程序 《编译原理》 { switch (lookahead) { case Select (A u 1): /* code to recognize u 1 */ break; case Select (A u 2): /* code to recognize u 2 */ break; . . . case Select (A un): /* code to recognize un */ break; default: printf("syntax error n"); exit(0); } - 一般结构 设 A 的产生式: A u 1 u 2. . . un, 相对于非终结符 A 的递归下降子程序 Parse. A 的一般结 构如右图所示 }
递归下降 LL(1)分析程序 《编译原理》 - 接上例 针对文法G(S)构造的递归下降分析程序 G(S): S Aa. S Bb. S d A a B c case b, c: Parse. B( ); Match. Token(b); Parse. S( ); break; case d: Match. Token(d); break; default: printf("syntax error Select(S Aa. S) = {a} Select(S Bb. S) = {c, b} Select(S d) = {d} void Parse. S( ) { switch (lookahead) { case a: Parse. A( ); Match. Token(a); Parse. S( ); break; n") exit(0); } }
- 递归下降 LL(1)分析程 《编译原理》 序 接上例 针对文法G(S) 构造的递归下降分析程序 G(S): S Aa. S Bb. S d A a B c void Parse. B( ) { if (lookahead==c) { Match. Token(c); } else if (lookahead==b) { } else { printf("syntax error n”); exit(0); } } Select(A a) = {a} Select(B ) = {b} Select(B c) = {c} void Parse. A( ) { if (lookahead==a) { Match. Token(a); } else { printf("syntax error n”); exit(0); } }
- Slides: 79