2019/11/20-作业11

1. 文法 G(S):

(1)S -> AB

(2)A ->Da|ε

(3)B -> cC

(4)C -> aADC |ε

(5)D -> b|ε

验证文法 G(S)是不是 LL(1)文法?

2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?

3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

E()

    {T();

       E'();

     }

E'()

T()

T'()

F()

答案:

1. 文法 G(S)

FIRST(Da)={b,a}

FIRST(ε)={ε}

FIRST(aADC)={a}

FIRST(b)={b}

FOLLOW(A)={c,b,a,#}

FOLLOW(C)={#,}

FOLLOW(D)={a,#}

SELECT(A->Da)=FIRST(Da)={b,a}

SELECT(A->ε)=FIRST(ε)-{ε}UFOLLOW(A)=FOLLOW(A)={c,b,a,#}

因为SELECT(A->Da)和SELECT(A->ε)有交集,所以G(S)不是 LL(1)文法。

2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法?

SELECT集:
SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(i) ={i}
由于:
SELECT(E'->+TE')和SELECT(E'->ε)无交集
SELECT(T'->*FT')和SELECT(T'->ε)无交集
SELECT(F->(E))和SELECT(F->i)无交集
所以是LL(1)文法。

3.接2,如果是LL(1)文法,写出它的递归下降语法分析程序代码。

SELECT集:
SELECT(E->TE) =FIRST(TE')=FIRSI(T)-FIRST(F)U{*}={(, i, *}
SELECT(E'->+TE')=FIRST(+TE')={+}
SELECT(E'->ε)=follow(E')=follow(E)={#, )}
SELECT(T -> FT')=FRIST(FT')=FIRST(F)-{(, i}
SELECT(T'->*FT')=FRIST(*FT')={*}
SELECT(T'->ε)=follow(T')=follow(T)={#, ), +}
SELECT(F->(E))=FRIST((E)) ={(}
SELECT(F->i)=FRIST(i) ={i}

伪代码:

 1 void ParseE()
 2 {
 3     switch (lookahead)
 4     {
 5         case '(','i':
 6             ParseT();
 7             ParseEP();
 8             break;
 9         default:
10             printf("syntax error \n");
11     }
12 }
13 
14 void ParseEP()
15 {
16     switch (lookahead)
17     {
18         case '+':
19             MatchToken('+');
20             ParseT();
21             ParseEP();
22             break;
23         case ')','#':
24             break;
25         default:
26             printf("syntax error \n");
27     }
28 }
29 
30 void ParseT()
31 {
32     switch (lookahead)
33     {
34         case '(','i':
35             ParseF();
36             ParseTP();
37             break;
38         default:
39             printf("syntax error \n");
40     }
41 }
42 
43 void ParseTP()
44 {
45     switch (lookahead)
46     {
47         case '*':
48             MatchToken('*');
49             ParseF();
50             ParseTP();
51             break;
52         case '+',')', '#':
53             break;
54         default:
55             printf("syntax error \n");
56     }
57 }
58 
59 void ParseF()
60 {
61     switch (lookahead)
62     {
63         case '(':
64             MatchToken('(');
65             ParseE();
66             MatchToken(')');
67             break;
68         case 'i':
69             MatchToken('i');
70             break;
71         default:
72             printf("syntax error \n");
73     }
74 }

猜你喜欢

转载自www.cnblogs.com/Roromiya/p/11908747.html