编译原理个人作业--第五章——基于 编译原理 国防工业出版社 第三版

1

文法 G 1 G_1 G1

E → E + T ∣ T T → T ∗ F ∣ F F → ( E ) ∣ i E\rightarrow E+T|T\\ T\rightarrow T*F|F\\ F\rightarrow(E)|i EE+TTTTFFF(E)i

请证明 E + T ∗ F E+T*F E+TF是他的一个句型(课本写的是E+T*T感觉是印错了),指出它的所有短语,直接短语,句柄

证明过程

E ⇒ E + T ⇒ E + T ∗ F E\Rightarrow E+T\Rightarrow E+T*F EE+TE+TF

在这里插入图片描述

短语 (句型的语法树的任意一个子树节点组成的符号串都是该句型的短语)

  • E + T ∗ F E+T*F E+TF (根部E的叶节点符号串)
  • T ∗ F T*F TF (由E衍生出的根部T的叶节点符号串)

直接短语 (不再包含其他子树的数形成的短语)

  • T ∗ F T*F TF (由E衍生出的根部T的叶节点符号串) (T不再包含任何子树)

句柄 (直接短语中的最左直接短语

  • T ∗ F T*F TF

2

文法 G 2 G_2 G2

S → a ∣ ∧ ∣ ( T ) T → T , S ∣ S S\rightarrow a|\land|(T)\\ T\rightarrow T,S|S Sa(T)TT,SS

1 给出(a,(a,a))和(((a,a),^,(a)),a)的最左最右推导

(a,(a,a))最左推导

S ⇒ ( T ) ⇒ ( T , S ) ⇒ ( S , S ) ⇒ ( a , S ) ⇒ ( a , ( T ) ) ⇒ ( a , ( S , T ) ) ⇒ ( a , ( T , T ) ) ⇒ ( a , ( a , T ) ) ⇒ ( a , ( a , a ) ) S\Rightarrow (T)\Rightarrow (T,S) \Rightarrow (S,S)\Rightarrow (a,S) \Rightarrow (a,(T))\\\Rightarrow (a,(S,T))\Rightarrow (a,(T,T))\Rightarrow (a,(a,T))\Rightarrow (a,(a,a)) S(T)(T,S)(S,S)(a,S)(a,(T))(a,(S,T))(a,(T,T))(a,(a,T))(a,(a,a))

(a,(a,a))最右推导

S ⇒ ( T ) ⇒ ( T , S ) ⇒ ( T , ( T ) ) ⇒ ( T , ( T , S ) ) ⇒ ( T , ( T , a ) ) ⇒ ( T , ( S , a ) ) ⇒ ( T , ( a , a ) ) ⇒ ( S , ( a , a ) ) ⇒ ( a , ( a , a ) ) S\Rightarrow (T)\Rightarrow (T,S) \Rightarrow (T,(T)) \Rightarrow (T,(T,S)) \Rightarrow (T,(T,a)) \\\Rightarrow (T,(S,a)) \Rightarrow (T,(a,a)) \Rightarrow (S,(a,a)) \Rightarrow (a,(a,a)) S(T)(T,S)(T,(T))(T,(T,S))(T,(T,a))(T,(S,a))(T,(a,a))(S,(a,a))(a,(a,a))

(((a,a),^,(a)),a)最左推导

S ⇒ ( T ) ⇒ ( T , S ) ⇒ ( S , S ) ⇒ ( ( T ) , S ) ⇒ ( ( T , S ) , S ) ⇒ ( ( T , S , S ) , S ) ⇒ ( ( S , S , S ) , S ) ⇒ ( ( ( T ) , S , S ) , S ) ⇒ ( ( ( T , S ) , S , S ) , S ) ⇒ ( ( ( S , S ) , S , S ) , S ) ⇒ ( ( ( a , S ) , S , S ) , S ) ⇒ ( ( ( a , a ) , S , S ) , S ) ⇒ ( ( ( a , a ) , ∧ , S ) , S ) ⇒ ( ( ( a , a ) , ∧ , ( T ) ) , S ) ⇒ ( ( ( a , a ) , ∧ , ( S ) ) , S ) ⇒ ( ( ( a , a ) , ∧ , ( a ) ) , S ) ⇒ ( ( ( a , a ) , ∧ , ( a ) ) , a ) S\Rightarrow (T) \\\Rightarrow (T,S) \\\Rightarrow (S,S) \\\Rightarrow ((T),S) \\\Rightarrow ((T,S),S) \\ \Rightarrow ((T,S,S),S) \\\Rightarrow ((S,S,S),S) \\\Rightarrow (((T),S,S),S) \\ \Rightarrow (((T,S),S,S),S) \\\Rightarrow (((S,S),S,S),S) \\\Rightarrow (((a,S),S,S),S) \\\Rightarrow (((a,a),S,S),S) \\\Rightarrow (((a,a),\land,S),S) \\\Rightarrow (((a,a),\land,(T)),S) \\ \Rightarrow (((a,a),\land,(S)),S) \\\Rightarrow (((a,a),\land,(a)),S) \\\Rightarrow (((a,a),\land,(a)),a) S(T)(T,S)(S,S)((T),S)((T,S),S)((T,S,S),S)((S,S,S),S)(((T),S,S),S)(((T,S),S,S),S)(((S,S),S,S),S)(((a,S),S,S),S)(((a,a),S,S),S)(((a,a),,S),S)(((a,a),,(T)),S)(((a,a),,(S)),S)(((a,a),,(a)),S)(((a,a),,(a)),a)

(((a,a),^,(a)),a)最右推导

S ⇒ ( T ) ⇒ ( T , S ) ⇒ ( T , a ) ⇒ ( S , a ) ⇒ ( ( T ) , a ) ⇒ ( ( T , S ) , a ) ⇒ ( ( T , ( T ) ) , a ) ⇒ ( ( T , ( S ) ) , a ) ⇒ ( ( T , ( a ) ) , a ) ⇒ ( ( T , S , ( a ) ) , a ) ⇒ ( ( T , ∧ , ( a ) ) , a ) ⇒ ( ( S , ∧ , ( a ) ) , a ) ⇒ ( ( ( T ) , ∧ , ( a ) ) , a ) ⇒ ( ( ( T , S ) , ∧ , ( a ) ) , a ) ⇒ ( ( ( T , a ) , ∧ , ( a ) ) , a ) ⇒ ( ( ( S , a ) , ∧ , ( a ) ) , a ) ⇒ ( ( ( a , a ) , ∧ , ( a ) ) , a ) S\Rightarrow (T) \\\Rightarrow (T,S) \\\Rightarrow (T,a) \\ \Rightarrow (S,a) \\\Rightarrow ((T),a) \\\Rightarrow ((T, S),a) \\\Rightarrow ((T, (T)),a) \\ \Rightarrow ((T, (S)),a) \\\Rightarrow ((T, (a)),a) \\\Rightarrow ((T, S, (a)),a) \\\Rightarrow ((T, \land, (a)),a) \\\Rightarrow ((S, \land, (a)),a) \\\Rightarrow (((T), \land, (a)),a) \\\Rightarrow (((T,S), \land, (a)),a) \\\Rightarrow (((T,a), \land, (a)),a) \\\Rightarrow (((S,a), \land, (a)),a) \\\Rightarrow (((a,a), \land, (a)),a) S(T)(T,S)(T,a)(S,a)((T),a)((T,S),a)((T,(T)),a)((T,(S)),a)((T,(a)),a)((T,S,(a)),a)((T,,(a)),a)((S,,(a)),a)(((T),,(a)),a)(((T,S),,(a)),a)(((T,a),,(a)),a)(((S,a),,(a)),a)(((a,a),,(a)),a)

2 (((a,a),^,(a)),a)的规范规约和句柄

详见课本88页

规范归约/最左归约是关于是一个最右推导/规范推导的逆过程

由规范推导推出的句型称为规范句型。

于是根据前一问逆向推导得到规范规约

  1. ( ( ( a ‾ , a ) , ∧ , ( a ) ) , a ) (((\underline{a},a), \land, (a)),a) (((a,a),,(a)),a)
  2. ( ( ( S ‾ , a ) , ∧ , ( a ) ) , a ) (((\underline{S},a), \land, (a)),a) (((S,a),,(a)),a)
  3. ( ( ( T , a ‾ ) , ∧ , ( a ) ) , a ) (((T,\underline{a}), \land, (a)),a) (((T,a),,(a)),a)
  4. ( ( ( T , S ‾ ) , ∧ , ( a ) ) , a ) (((\underline{T,S}), \land, (a)),a) (((T,S),,(a)),a)
  5. ( ( ( T ) ‾ , ∧ , ( a ) ) , a ) ((\underline{(T)}, \land, (a)),a) (((T),,(a)),a)
  6. ( ( S ‾ , ∧ , ( a ) ) , a ) ((\underline{S}, \land, (a)),a) ((S,,(a)),a)
  7. ( ( T , ∧ ‾ , ( a ) ) , a ) ((T,\underline{\land}, (a)),a) ((T,,(a)),a)
  8. ( ( T , S ‾ , ( a ) ) , a ) ((\underline{T,S}, (a)),a) ((T,S,(a)),a)
  9. ( ( T , ( a ‾ ) ) , a ) ((T, (\underline{a})),a) ((T,(a)),a)
  10. ( ( T , ( S ‾ ) ) , a ) ((T, (\underline{S})),a) ((T,(S)),a)
  11. ( ( T , ( T ) ‾ ) , a ) ((T, \underline{(T)}),a) ((T,(T)),a)
  12. ( ( T , S ‾ ) , a ) ((\underline{T, S}),a) ((T,S),a)
  13. ( ( T ) ‾ , a ) (\underline{(T)},a) ((T),a)
  14. ( S ‾ , a ) (\underline{S},a) (S,a)
  15. ( T , a ‾ ) (T,\underline{a}) (T,a)
  16. ( T , S ‾ ) (\underline{T,S}) (T,S)
  17. ( T ) ‾ \underline{(T)} (T)
  18. S S S

栈内部的内容需要和输入串的内容一致

步骤符号栈输入串动作
0# ( ( ( a , a ) , ∧ , ( a ) ) , a ) (((a,a), \land, (a)),a) (((a,a),,(a)),a)initial
1# ( ( ( ( ( a , a ) , ∧ , ( a ) ) , a ) ((a,a), \land, (a)),a) ((a,a),,(a)),a)移进
2# ( ( (( (( ( a , a ) , ∧ , ( a ) ) , a ) (a,a), \land, (a)),a) (a,a),,(a)),a)移进
3# ( ( ( ((( ((( a , a ) , ∧ , ( a ) ) , a ) a,a), \land, (a)),a) a,a),,(a)),a)移进
4# ( ( ( a (((a (((a , a ) , ∧ , ( a ) ) , a ) ,a), \land, (a)),a) ,a),,(a)),a)移进
5# ( ( ( S (((S (((S , a ) , ∧ , ( a ) ) , a ) ,a), \land, (a)),a) ,a),,(a)),a)归约 S → a S\rightarrow a Sa
6# ( ( ( T (((T (((T , a ) , ∧ , ( a ) ) , a ) ,a), \land, (a)),a) ,a),,(a)),a)归约 T → S T\rightarrow S TS
7# ( ( ( T , (((T, (((T, a ) , ∧ , ( a ) ) , a ) a), \land, (a)),a) a),,(a)),a)移进
8# ( ( ( T , a (((T,a (((T,a ) , ∧ , ( a ) ) , a ) ), \land, (a)),a) ),,(a)),a)移进
9# ( ( ( T , S (((T,S (((T,S ) , ∧ , ( a ) ) , a ) ), \land, (a)),a) ),,(a)),a)归约 S → a S\rightarrow a Sa
10# ( ( ( T (((T (((T ) , ∧ , ( a ) ) , a ) ), \land, (a)),a) ),,(a)),a)归约 T → T , S T\rightarrow T,S TT,S
11# ( ( ( T ) (((T) (((T) , ∧ , ( a ) ) , a ) , \land, (a)),a) ,,(a)),a)移进
12# ( ( S ((S ((S , ∧ , ( a ) ) , a ) , \land, (a)),a) ,,(a)),a)规约 S → ( T ) S\rightarrow(T) S(T)
13# ( ( T ((T ((T , ∧ , ( a ) ) , a ) , \land, (a)),a) ,,(a)),a)规约 T → S T\rightarrow S TS
14# ( ( T , ((T, ((T, ∧ , ( a ) ) , a ) \land, (a)),a) ,(a)),a)移进
15# ( ( T , ∧ ((T,\land ((T, , ( a ) ) , a ) , (a)),a) ,(a)),a)移进
16# ( ( T , S ((T,S ((T,S , ( a ) ) , a ) , (a)),a) ,(a)),a)规约 S → ∧ S\rightarrow \land S
17# ( ( T ((T ((T , ( a ) ) , a ) , (a)),a) ,(a)),a)规约 T → T , S T\rightarrow T,S TT,S
18# ( ( T , ((T, ((T, ( a ) ) , a ) (a)),a) (a)),a)移进
19# ( ( T , ( ((T,( ((T,( a ) ) , a ) a)),a) a)),a)移进
20# ( ( T , ( a ((T,(a ((T,(a ) ) , a ) )),a) )),a)移进
21# ( ( T , ( S ((T,(S ((T,(S ) ) , a ) )),a) )),a)归约 S → a S\rightarrow a Sa
22# ( ( T , ( T ((T,(T ((T,(T ) ) , a ) )),a) )),a)归约 T → S T\rightarrow S TS
23# ( ( T , ( T ) ((T,(T) ((T,(T) ) , a ) ),a) ),a)移进
24# ( ( T , S ((T,S ((T,S ) , a ) ),a) ),a) S → ( T ) S\rightarrow(T) S(T)
25# ( ( T ((T ((T ) , a ) ),a) ),a) T → T , S T\rightarrow T,S TT,S
26# ( ( T ) ((T) ((T) , a ) ,a) ,a)移进
27# ( S (S (S , a ) ,a) ,a)规约 S → ( T ) S\rightarrow (T) S(T)
28# ( T (T (T , a ) ,a) ,a)规约 T → S T\rightarrow S TS
29# ( T , (T, (T, a ) a) a)移进
30# ( T , a (T,a (T,a ) ) )移进
31# ( T , S (T,S (T,S ) ) )规约 S → a S\rightarrow a Sa
32# ( T (T (T ) ) )规约 T → T , S T\rightarrow T,S TT,S
33# ( T ) (T) (T)移进
34# S S S规约 S → ( T ) S\rightarrow (T) S(T)

5

文法
S → A S ∣ b A → S A ∣ a S\rightarrow AS|b\\ A\rightarrow SA|a SASbASAa

在这里插入图片描述
如果你的起始符号不止一个产生式就得加S’,只有一个产生式可以不加

加入 S’->S

1. 所有的LR(0)项目

S ′ → ⋅ S ( 这个需要自己添加 ) S'\rightarrow \cdot S(这个需要自己添加) SS(这个需要自己添加)
S → ⋅ A S S → A ⋅ S S → A S ⋅ S\rightarrow \cdot AS\quad S\rightarrow A\cdot S\quad S\rightarrow AS \cdot SASSASSAS
S → ⋅ b S → b ⋅ S\rightarrow \cdot b \quad S\rightarrow b\cdot SbSb
A → ⋅ S A A → S ⋅ A A → S A ⋅ A\rightarrow \cdot SA\quad A\rightarrow S\cdot A\quad A\rightarrow SA \cdot ASAASAASA
A → ⋅ a A → a ⋅ A\rightarrow \cdot a \quad A\rightarrow a\cdot AaAa

2. 文法的LR(0)项目规范组和识别活前缀的DFA

I 0 I_0 I0

拿出最开始的规约 ① S ′ → ⋅ S ①S'\rightarrow \cdot S SS
找出所有满足 S → ⋅ s o m e t h i n g S\rightarrow \cdot something Ssomething的情况,根据前文有 ② S → ⋅ A S ③ S → ⋅ b ②S\rightarrow \cdot AS\quad ③S\rightarrow \cdot b SASSb, 此时注意到 S → ⋅ A S S\rightarrow \cdot AS SAS,需要再考虑所有满足 A → ⋅ s o m e t h i n g A\rightarrow \cdot something Asomething的情况 ④ A → ⋅ a ⑤ A → ⋅ S A ④A\rightarrow \cdot a\quad⑤ A\rightarrow \cdot SA AaASA

于是我们得到 I 0 I_0 I0
① S ′ → ⋅ S ② S → ⋅ A S ( 由于①获得 ) ③ S → ⋅ b ( 由于①获得 ) ④ A → ⋅ a ( 由于②获得 ) ⑤ A → ⋅ S A ( 由于②获得 ) ①S'\rightarrow \cdot S\\ ②S\rightarrow \cdot AS(由于①获得)\\ ③S\rightarrow \cdot b(由于①获得)\\ ④A\rightarrow \cdot a(由于②获得) \\ ⑤A\rightarrow \cdot SA(由于②获得) SSSAS(由于获得)Sb(由于获得)Aa(由于获得)ASA(由于获得)

I 1 I_1 I1

观察 I 0 I_0 I0数据,不难发现 ⋅ \cdot 后面接的数据有 S , A , b , a S,A,b,a S,A,b,a,所以可以在 I 0 I_0 I0的基础上状态转移,这里首先转移出S,发现 ⋅ \cdot 后接S的有 ①和⑤ ①和⑤

I 1 I_1 I1一开始
① S ′ → S ⋅ ② A → S ⋅ A ①S'\rightarrow S\cdot\\ ②A\rightarrow S\cdot A SSASA
不难发现①的dot后面没有数据了,所以无法在加项目集,观察②,dot后方为A,所以还需要加 A → ⋅ s o m e t h i n g A\rightarrow \cdot something Asomething

① S ′ → S ⋅ ② A → S ⋅ A ③ A → ⋅ a ( 由于②获得 ) ④ A → ⋅ S A ( 由于②获得 ) ①S'\rightarrow S\cdot\\ ②A\rightarrow S\cdot A\\ ③A\rightarrow \cdot a(由于②获得) \\ ④A\rightarrow \cdot SA(由于②获得) SSASAAa(由于获得)ASA(由于获得)
再根据④,考虑 S → ⋅ s o m e t h i n g S\rightarrow \cdot something Ssomething
① S ′ → S ⋅ ② A → S ⋅ A ③ A → ⋅ a ( ② ) ④ A → ⋅ S A ( ② ) ⑤ S → ⋅ A S ( ④ ) ⑥ S → ⋅ b ( ④ ) ①S'\rightarrow S\cdot\\ ②A\rightarrow S\cdot A\\ ③A\rightarrow \cdot a(②) \\ ④A\rightarrow \cdot SA(②)\\ ⑤S\rightarrow \cdot AS(④)\\ ⑥S\rightarrow \cdot b(④)\\ SSASAAa()ASA()SAS()Sb()

I 2 I_2 I2

I 0 I_0 I0从A出发,一开始
① S → A ⋅ S ① S\rightarrow A\cdot S SAS

S → ⋅ s o m e t h i n g S\rightarrow \cdot something Ssomething

② S → ⋅ A S ③ S → ⋅ b ②S\rightarrow \cdot AS\\ ③S\rightarrow \cdot b SASSb

A → ⋅ s o m e t h i n g A\rightarrow \cdot something Asomething

④ A → ⋅ a ⑤ A → ⋅ S A ④A\rightarrow \cdot a\\ ⑤A\rightarrow \cdot SA AaASA

没有新的LR(0)项目,结束 I 2 I_2 I2更新

I 3 I_3 I3

I 0 I_0 I0从a出发
A → a ⋅ A\rightarrow a\cdot Aa

I 4 I_4 I4

I 0 I_0 I0从b出发
S → b ⋅ S\rightarrow b\cdot Sb

I 5 I_5 I5

I 1 I_1 I1从a和b出发为 I 3 和 I 4 I_3和I_4 I3I4,还可以从S和A出发,这里先从S出发

① A → S ⋅ A ① A\rightarrow S\cdot A ASA
根据前面的推导,可以直接把 S → ⋅ s o m e t h i n g S\rightarrow \cdot something Ssomething A → ⋅ s o m e t h i n g A\rightarrow \cdot something Asomething放进去

① A → S ⋅ A ② A → ⋅ a ③ A → ⋅ S A ④ S → ⋅ A S ⑤ S → ⋅ b ① A\rightarrow S\cdot A \\ ②A\rightarrow \cdot a \\ ③A\rightarrow \cdot SA\\ ④S\rightarrow \cdot AS\\ ⑤S\rightarrow \cdot b\\ ASAAaASASASSb

I 6 I_6 I6

I 1 I_1 I1从A出发
① A → S A ⋅ ② S → A ⋅ S ①A\rightarrow SA\cdot\\ ②S\rightarrow A\cdot S ASASAS

根据前面的推导,可以直接把 S → ⋅ s o m e t h i n g S\rightarrow \cdot something Ssomething A → ⋅ s o m e t h i n g A\rightarrow \cdot something Asomething放进去

① A → S A ⋅ ② S → A ⋅ S ③ A → ⋅ a ④ A → ⋅ S A ⑤ S → ⋅ A S ⑥ S → ⋅ b ①A\rightarrow SA\cdot\\ ②S\rightarrow A\cdot S\\ ③A\rightarrow \cdot a \\ ④A\rightarrow \cdot SA\\ ⑤S\rightarrow \cdot AS\\ ⑥S\rightarrow \cdot b\\ ASASASAaASASASSb

I 7 I_7 I7

观察 I 2 I_2 I2,不难发现A返回自己,a变成 I 3 I_3 I3,b变成 I 4 I_4 I4,剩下S
S → A S ⋅ A → S ⋅ A S\rightarrow AS\cdot \\ A\rightarrow S\cdot A SASASA

拓展得到
① S → A S ⋅ ② A → S ⋅ A ③ A → ⋅ a ④ A → ⋅ S A ⑤ S → ⋅ A S ⑥ S → ⋅ b ①S\rightarrow AS\cdot \\ ②A\rightarrow S\cdot A\\ ③A\rightarrow \cdot a \\ ④A\rightarrow \cdot SA\\ ⑤S\rightarrow \cdot AS\\ ⑥S\rightarrow \cdot b\\ SASASAAaASASASSb

剩余的情况

经过检验 I 3 到 I 7 I_3到I_7 I3I7都无法产生新的状态,不妨写出状态转换对
< I 0 , S , I 1 > < I 0 , A , I 2 > < I 0 , a , I 3 > < I 0 , b , I 4 > < I 1 , S , I 5 > < I 1 , A , I 6 > < I 1 , a , I 3 > < I 1 , b , I 4 > < I 2 , S , I 7 > < I 2 , A , I 2 > < I 2 , a , I 3 > < I 2 , b , I 4 > < I 5 , S , I 5 > < I 5 , A , I 6 > < I 5 , a , I 3 > < I 5 , b , I 4 > < I 6 , S , I 7 > < I 6 , A , I 2 > < I 6 , a , I 3 > < I 6 , b , I 4 > < I 7 , S , I 5 > < I 7 , A , I 6 > < I 7 , a , I 3 > < I 7 , b , I 4 > <I_0,S,I_1>\quad <I_0,A,I_2> \quad <I_0,a,I_3>\quad <I_0,b,I_4>\\ <I_1,S,I_5>\quad <I_1,A,I_6> \quad <I_1,a,I_3>\quad <I_1,b,I_4>\\ <I_2,S,I_7>\quad <I_2,A,I_2> \quad <I_2,a,I_3>\quad <I_2,b,I_4>\\ <I_5,S,I_5>\quad <I_5,A,I_6> \quad <I_5,a,I_3>\quad <I_5,b,I_4>\\ <I_6,S,I_7>\quad <I_6,A,I_2> \quad <I_6,a,I_3>\quad <I_6,b,I_4>\\ <I_7,S,I_5>\quad <I_7,A,I_6> \quad <I_7,a,I_3>\quad <I_7,b,I_4> <I0,S,I1><I0,A,I2><I0,a,I3><I0,b,I4><I1,S,I5><I1,A,I6><I1,a,I3><I1,b,I4><I2,S,I7><I2,A,I2><I2,a,I3><I2,b,I4><I5,S,I5><I5,A,I6><I5,a,I3><I5,b,I4><I6,S,I7><I6,A,I2><I6,a,I3><I6,b,I4><I7,S,I5><I7,A,I6><I7,a,I3><I7,b,I4>

图如下

在这里插入图片描述

3. 是否为SLR?是则列出SLR分析表

首先如何判断?

  1. 看所有移进项目,点后面跟的终结符作为一个集合
  2. 找到所有规约项目,每个规约项目的左半部分构造FOLLOW
  3. 要求1这个集合与2创造出的所有集合两两相交为空

I 1 , I 6 , I 7 I_1,I_6,I_7 I1,I6,I7有移进规约冲突

针对 I 1 I_1 I1

S ′ → S ⋅ ( 规约 ) A → ⋅ a ( 移进 ) S → ⋅ b ( 移进 ) S'\rightarrow S\cdot (规约)\\ A\rightarrow \cdot a (移进)\\ S\rightarrow \cdot b (移进) SS(规约)Aa(移进)Sb(移进)
可以考虑 F O L L O W ( S ′ ) = { # } FOLLOW(S') = \{\#\} FOLLOW(S)={#},不包含 a 或 b.
A C T I O N ( 1 , # ) = a c c ACTION(1,\#) = acc ACTION(1,#)=acc解决

I 6 I_6 I6
A → S A ⋅ ( 规约 ) A → ⋅ a ( 移进 ) S → ⋅ b ( 移进 ) A\rightarrow SA\cdot(规约)\\ A\rightarrow \cdot a (移进)\\ S\rightarrow \cdot b (移进) ASA(规约)Aa(移进)Sb(移进)

此时考察规约项目 A → S A ⋅ A\rightarrow SA\cdot ASA,查看 F O L L O W ( A ) = { a , b } FOLLOW(A) = \{a,b\} FOLLOW(A)={a,b},而后续跟的是终结符 # \# #,无法用SLR解决

I 6 I_6 I6

S → A S ⋅ ( 规约 ) A → ⋅ a ( 移进 ) S → ⋅ b ( 移进 ) S\rightarrow AS\cdot (规约)\\ A\rightarrow \cdot a (移进)\\ S\rightarrow \cdot b (移进) SAS(规约)Aa(移进)Sb(移进)

考虑规约项目 S → A S ⋅ S\rightarrow AS\cdot SAS
F O L L O W ( S ) = { # , a , b } FOLLOW(S) = \{\#,a,b\} FOLLOW(S)={#,a,b}
同理无法用SLR解决

综上,不是SLR文法

4. 是否为LALR或LR(1)

先构造出拓广文法

S ′ → S S → A S S → b A → S A A → a S'\rightarrow S\\ S\rightarrow AS\\ S\rightarrow b\\ A \rightarrow SA\\ A \rightarrow a SSSASSbASAAa

在这里插入图片描述

I 0 I_0 I0

首先先将最初始的 S ′ → ⋅ S S'\rightarrow \cdot S SS放入,由于S后方为空串,所以这里应该为
① S ′ → ⋅ S , # ① S'\rightarrow \cdot S,\# SS,#
现在由于右边为 ⋅ S \cdot S S,我们需要把S有关的产生式都放入内部 S → A S S → b S\rightarrow AS\quad S\rightarrow b SASSb, 注意到这两个产生式是源于的,①的展望串为#,所以② ③的展望串接着S

② S → ⋅ A S , # ③ S → ⋅ b , # ② S\rightarrow \cdot AS,\#\\ ③ S\rightarrow \cdot b,\# SAS,#Sb,#

观察到②的点后为A,A的后方为S,这说明,我们需要将 A A A有关的产生式放进来,并且展望串应该等价于 F I R S T ( S ) = { a , b } FIRST(S) = \{a,b\} FIRST(S)={a,b}

A → ⋅ S A , a A → ⋅ S A , b A → ⋅ a , a A → ⋅ a , b A\rightarrow \cdot SA, a \\ A\rightarrow \cdot SA, b \\ A\rightarrow \cdot a, a \\ A\rightarrow \cdot a, b \\ ASA,aASA,bAa,aAa,b
合并成为
④ A → ⋅ S A , a / b ⑤ A → ⋅ a , a / b ④A\rightarrow \cdot SA, a/b \\ ⑤A\rightarrow \cdot a, a/b \\ ASA,a/bAa,a/b

根据④我们又可以重新考虑 S S S的产生式,并且由于这是因为④引入的产生式,我们要将 F I R S T ( A ) = { a , b } FIRST(A) = \{a,b\} FIRST(A)={a,b}作为展望串
S → ⋅ A S , a / b S → ⋅ b , a / b S\rightarrow \cdot AS,a/b\\ S\rightarrow \cdot b,a/b SAS,a/bSb,a/b
与② ③合并得到 I 0 I_0 I0

① S ′ → ⋅ S , # ② S → ⋅ A S , # / a / b ③ S → ⋅ b , # / a / b ④ A → ⋅ S A , a / b ⑤ A → ⋅ a , a / b ① S'\rightarrow \cdot S,\# \\ ②S\rightarrow \cdot AS,\#/a/b\\ ③S\rightarrow \cdot b,\#/a/b\\ ④A\rightarrow \cdot SA, a/b \\ ⑤A\rightarrow \cdot a, a/b \\ SS,#SAS,#/a/bSb,#/a/bASA,a/bAa,a/b

I 1 I_1 I1

I 0 I_0 I0出发,识别S

① S ′ → S ⋅ , # ② A → S ⋅ A , a / b ① S'\rightarrow S\cdot,\# \\ ②A\rightarrow S\cdot A, a/b \\ SS,#ASA,a/b
显然①没有啥能拓展的,考虑②,需要考虑所有A的产生式,且展望式包括a,b,并且A后方没有数字了,这时候展望串直接继承a/b

这里后方没有数字指的是A后面为epsilon,这时就是直接求 F I R S T ( ϵ a ) FIRST(\epsilon a) FIRST(ϵa) F I R S T ( ϵ b ) FIRST(\epsilon b) FIRST(ϵb)

③ A → ⋅ S A , a / b ④ A → ⋅ a , a / b ③A\rightarrow \cdot SA, a/b \\ ④A\rightarrow \cdot a, a/b \\ ASA,a/bAa,a/b

再考虑S的产生式 —— 由于S后方为A,不能直接继承③的展望式,而是FIRST(A)作为展望式 (虽然没区别但是本质不太一样)

⑤ S → ⋅ A S , a / b ⑥ S → ⋅ b , a / b ⑤S\rightarrow \cdot AS, a/b\\ ⑥S\rightarrow\cdot b, a/b SAS,a/bSb,a/b
考虑⑤,发现新产生的式子和③④一致,结束

I 2 I_2 I2

I 0 I_0 I0出发,识别A

① S → A ⋅ S , # / a / b ① S\rightarrow A\cdot S, \#/a/b SAS,#/a/b

S的产生式(①的S后面没有数据,直接继承它的展望式)
② S → ⋅ A S , # / a / b ③ S → ⋅ b , # / a / b ②S\rightarrow \cdot AS, \#/a/b\\ ③S\rightarrow\cdot b, \#/a/b SAS,#/a/bSb,#/a/b

A的产生式由于③被纳入,且A后接着S,展望式为,FIRST(S)

④ A → ⋅ S A , a / b ⑤ A → ⋅ a , a / b ④A\rightarrow \cdot SA, a/b \\ ⑤A\rightarrow \cdot a, a/b \\ ASA,a/bAa,a/b

I 3 I_3 I3

I 0 I_0 I0识别 a

A → a ⋅ , a / b A\rightarrow a\cdot, a/b Aa,a/b

I 4 I_4 I4

I 0 I_0 I0识别 b

S → b ⋅ , a / b S\rightarrow b\cdot, a/b Sb,a/b

依次类推

得到下图
在这里插入图片描述

其中 I 6 I_6 I6 A → S A ⋅ , a / b A\rightarrow SA\cdot, a/b ASA,a/b要求输入a或b的时候使用 A → S A 规约 A\rightarrow SA规约 ASA规约

但是 S → ⋅ b , a / b A → ⋅ a , a / b S\rightarrow \cdot b, a/b\quad A\rightarrow \cdot a, a/b Sb,a/bAa,a/b要求移进,冲突,所以不是 L R ( 1 ) LR(1) LR(1)文法

7. 证明下面的文法SLR(1) 不是LR(0)

S → A A → A b ∣ b B a B → a A c ∣ a ∣ a A b S\rightarrow A\\ A\rightarrow Ab|bBa\\ B\rightarrow aAc|a|aAb SAAAbbBaBaAcaaAb

在这里插入图片描述

状态2存在 移进规约冲突(点·的前方完全一样,后缀不一样)
S → A ⋅ A → A ⋅ b S\rightarrow A\cdot \\ A\rightarrow A\cdot b SAAAb

【这是错的,但是为了方便复习还是把错误留下来比较好】状态5存在 移进规约冲突(点·的前方完全一样,后缀不一样)【指正:A是非终结符,所以这里根本不会产生冲突,请忽略掉状态5,这是没冲突的】

B → a ⋅ A c B → a ⋅ B → a ⋅ A b B\rightarrow a\cdot Ac \\ B\rightarrow a\cdot \\ B\rightarrow a\cdot Ab BaAcBaBaAb

状态9存在规约规约冲突(点的前方的后缀(完全/部分)相同)

B → a A b ⋅ A → A b ⋅ B\rightarrow aAb\cdot \\ A\rightarrow Ab\cdot BaAbAAb

所以他不是LR0文法

对于 I 2 I_2 I2

F O L L O W ( S ) = { # } 我们有 F O L L O W ( S ) ∩ { b } = ∅ 可以令 A C T I O N ( 2 , # ) = r 1 , A C T I O N ( 2 , b ) = S 6 FOLLOW(S) = \{\#\}我们有FOLLOW(S)\cap \{b\} = \empty \quad 可以令ACTION(2,\#) = r_1, ACTION(2,b) = S_6 FOLLOW(S)={#}我们有FOLLOW(S){b}=可以令ACTION(2,#)=r1,ACTION(2,b)=S6

I 5 I_5 I5

【所以这里也是错的】

F O L L O W ( B ) = { a } 显然他和 { ϵ } 交集为 ∅ , 令 A C T I O N ( 5 , a ) = r 5 FOLLOW(B) = \{a\}显然他和\{\epsilon\}交集为\empty, 令ACTION(5,a) = r_5 FOLLOW(B)={a}显然他和{ϵ}交集为,ACTION(5,a)=r5

I 9 I_9 I9

需要考虑产生式A和B
F O L L O W ( A ) = { # , b , c } FOLLOW(A) = \{\#,b,c\} FOLLOW(A)={#,b,c}

F O L L O W ( A ) ∩ F O L L O W ( B ) = ∅ FOLLOW(A)\cap FOLLOW(B) = \empty FOLLOW(A)FOLLOW(B)=

得到SLR(1)分析表

ACTIONGOTO
abc#AB
0S21
1S3ACC
2S54
3R1R1R1
4S6
5R4S27
6R2R2R2
7S9S8
8R5
9R5R1R1R1

没重复定义,为SLR1文法

addition

拓广文法

S ′ → S S → i C t S S → i C t S e S S → a C → b S'\rightarrow S\\ S\rightarrow iCtS \\ S \rightarrow iCtSeS \\ S \rightarrow a \\ C \rightarrow b SSSiCtSSiCtSeSSaCb

LR0规范族

I 0 I_0 I0
S ′ → ⋅ S S → ⋅ i C t S S → ⋅ i C t S e S S → ⋅ a S'\rightarrow \cdot S\\ S\rightarrow \cdot iCtS \\ S \rightarrow \cdot iCtSeS \\ S \rightarrow \cdot a SSSiCtSSiCtSeSSa

I 1 I_1 I1
S ′ → S ⋅ S'\rightarrow S\cdot SS

I 2 I_2 I2

S ′ → a ⋅ S'\rightarrow a\cdot Sa

I 3 I_3 I3

S → i ⋅ C t S S → i ⋅ C t S e S C → ⋅ b S\rightarrow i\cdot CtS \\ S \rightarrow i\cdot CtSeS \\ C \rightarrow \cdot b SiCtSSiCtSeSCb

I 4 I_4 I4
C → b ⋅ C \rightarrow b \cdot Cb

I 5 I_5 I5

S → i C ⋅ t S S → i C ⋅ t S e S S\rightarrow i C\cdot tS \\ S \rightarrow i C\cdot tSeS \\ SiCtSSiCtSeS

I 6 I_6 I6

S → i C t ⋅ S S → i C t ⋅ S e S S → ⋅ i C t S S → ⋅ i C t S e S S → ⋅ a S\rightarrow i C t\cdot S \\ S \rightarrow i C t \cdot SeS \\ S\rightarrow \cdot iCtS \\ S \rightarrow \cdot iCtSeS \\ S \rightarrow \cdot a SiCtSSiCtSeSSiCtSSiCtSeSSa

I 7 I_7 I7

S → i C t S ⋅ S → i C t S ⋅ e S S\rightarrow i C t S\cdot \\ S \rightarrow i C t S\cdot eS SiCtSSiCtSeS

I 8 I_8 I8
S → i C t S e ⋅ S S → ⋅ i C t S S → ⋅ i C t S e S S → ⋅ a S \rightarrow i C t S e\cdot S S\rightarrow \cdot iCtS \\ S \rightarrow \cdot iCtSeS \\ S \rightarrow \cdot a SiCtSeSSiCtSSiCtSeSSa

I 9 I_9 I9
S → i C t S e S ⋅ S \rightarrow i C t S e S\cdot SiCtSeS

在这里插入图片描述

ACTIONGOTO
iteab#SC
0s3s21
0acc
2r3r3r3r3r3r3
3s45
4r4r4r4r4r4r4
5s6
6s3s27
7r1r1s8r1r1r1
8s3s29
9r2r2r2r2r2r2
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理第三第六章主要介绍了自顶向下语法分析和递归下降语法分析相关内容。其中包括了预测翻译器的设计方法、S-属性文法的定义和使用、语法制导翻译的实现等。具体内容如下: 1. 自顶向下语法分析 自顶向下语法分析是一种从语法的高层符号开始,逐步向下展开,直到推导出输入串的过程。它的主要思想是将输入串与语法规则进行匹配,从而得到语法树。自顶向下语法分析的方法包括了递归下降分析、LL分析和预测分析等。 2. 递归下降语法分析 递归下降语法分析是一种自顶向下语法分析的方法,它的主要思想是将每个非终结符对应的语法规则转化为一个对应的函数,然后通过递归调用这些函数来实现语法分析。递归下降语法分析的优点是易于理解和实现,但是它也存在一些问题,例如左递归和回溯等。 3. 预测翻译器的设计方法 预测翻译器是一种递归下降语法分析的方法,它的主要思想是通过预测下一个输入符号来选择相应的语法规则进行语法分析。预测翻译器的设计方法包括了FIRST集和FOLLOW集的计算、LL(1)文法的定义和使用等。 4. S-属性文法的定义和使用 S-属性文法是一种语法制导翻译的方法,它的主要思想是将语法规则和属性相结合,通过对语法树的遍历来计算属性值。S-属性文法的定义和使用包括了属性的定义、属性计算规则的定义、属性计算顺序的确定等。 5. 语法制导翻译的实现 语法制导翻译是一种将语法分析和语义分析相结合的方法,它的主要思想是通过对语法树的遍历来实现语义分析。语法制导翻译的实现包括了属性计算的方法、类型检查的方法、中间代码生成的方法等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值