第5章 语法分析——自下而上分析

合集下载

第五章语法分析—自下而上分析

第五章语法分析—自下而上分析
■ 例:考虑文法G(E):E T | E+T T F | T*F F (E) | i
输入串为i1*i2+i3 ,分析步骤为:
步骤 0 1 2 3 4
符号栈 # #i1 #F #T #T*
输入串 i1*i2+i3#
*i2+i3# *i2+i3# *i2+i3#
i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
设Q代表OPTR栈顶的当前符号,a代表新的输入符号, 则直观算符优先算法为:
1.Read next symbol to a; 2.If a=i then push a into OPND,GOTO 1; 3.If Q ·> a then Call E(1)QE(2);GOTO 3;
(注:E(1)QE(2)指pop E(1);pop E(2); t:=E(1),&,E(2)进行Q运算;push t;pop Q);
第五章 语法分析—自下而上分析
主要内容:
第五章 语法分析-自下而上分析
5.1 自下而上分析基本问题
5.2 算符优先分析
5.3 LR分析概述
5.4 LR(0)分析
5.5 SLR(1)分析
5.6 LR(1)分析
5.7 LALR (1)分析
5.8 二义文法的应用
2019/10/17
先乘除后加减,同级从左到右
考虑二义文法文法G(E): G(E): E i| E+E|E-E|E*E|E/E|(E) 它的句子有几种不同的规范规约。
归约即计算表达式的值。归约顺序不同, 则计算的顺序也不同,结果也不一样。
如果规定算符的优先次序,并按这种规定 进行归约,则归约过程是唯一的。

第5章 语法分析(2)自下而上分析

第5章 语法分析(2)自下而上分析

则成功,达不到这种格局则输入串有错误。

栈中符号串+剩余输入串 = 规范句型。
26
规范归约分析算法
1. 在栈底放入# ,在输入串尾附上#; 2. 逐个移入输入符号,当栈顶形成句柄时,进行归约; 3. 重复2 直到输入串已全部进栈,仅剩#, 4. 若栈中归约为#S, 表示分析成功,输入串为合法的 句子,否则为非法句子.
2
5.1 自下而上分析的基本问题

自下而上分析法的基本思想:
从输入串出发,反复利用产生式逐步进行 ‚归约‛,如果最后能归约到文法的开始符 号,则输入串是句子,否则输入串有语法错 误。

各种不同自下而上分析法一个共同特点是:
边输入单词符号(移进栈),边归约;
3
5.1 自下而上分析的基本问题

自下而上分析的基本技术是采用归约栈,如下图所示: #

或者说从文法的开始符号产生句子。

自下而上分析采用的方法是归约,从叶子到根构造分析树。

或者说从句子开始归约出文法的开始符号。

语法树的一个子树:由该树的某个结连同它的所有子孙组成。 在自下而上分析过程中,每一步归约都可画出一棵子树。
例如,上例中的归约过程可描述为如下分析树:
9
例5.2:文法G[S], 其4条产生式如下: ① S→aABe ② A→b ③ A→Abc ④ B→d 对句子abbcde的分析 最右推导 SaABeaAdeaAbcdeabbcde 最左归约 abbcde,aAbcde ,aAde,aABe ,S S S aABe aAde aAbcde abbcde
S (2)每次归约用的句柄: , (a,(a)), , , , , , ( (L,(S)) (L,(L)) (L,S) (L) S (S,(a)) (L,(a)) L )

编译原理 - 自下而上的语法分析

编译原理 - 自下而上的语法分析

*
S A

A
则称是句型相对于非终结符A的短语。 特别是,如果有A,则称是句型
相对于规则A的直接短语 一个句型的最左直接短语称为该句型
的句柄
5.1.7 规范归约例一
▪ 例:文法G[E]:
E→E+T|T
T→T*F|F F→(E)|–F|id
考虑文法G[E]上的句子id1+id2*id3 ➢ 其最右推导和分析树如图5.1(a)、(b)所示
第五章 语法分析—自下而上分析
内容
▪ 自下而上分析基本问题 ▪ 算符优先分析
5.1 自下而上分析基本问题
▪ 自下而上分析基本问题
➢ 归约 ➢ 规范归约 ➢ 符号栈的使用 ➢ 语法树的表示
▪ 算符优先分析
5.1.1 自下而上分析
▪ 自下而上分析
abbcde aAbcde (A b)
➢ 从输入字符的角度而言 aAcde (A Ab)
➢ 最左归约
规范推导
▪ 由规范推导推出的句型称为规范句型。
▪ 规范归约的中心问题:确定句型的句柄。
5.1.2 规范归约简述
▪ 最右推导,推导的每一步结果都是一个右句 型。该推导即分析树 “剪句柄”的全过程。
S
S
S
S
S
a A B ea A B ea A B ea A B e
Ab c d
Ab c d
d
图5.1 id1+id2*id3的最右推导、分析树与短语 (a) 最右推导;(b) 分析树;(c) 短语
5.1.7.1 归约的分析树
▪ 分析树的叶子与短语、直接短语和句柄有下述关系 ➢ 短语 以非终结符为根的子树中所有从左到右排列的 叶子 ➢ 直接短语 只有父子关系的树中所有从左到右排列的叶子 树高为2 ➢ 句柄 最左边父子关系树中所有从左到右排列的叶子 句柄是唯一的

第5章 语法分析——自下而上

第5章 语法分析——自下而上

B d
e
SaAcBeaAcdeaAbcdeabbcde SS→aAcBeB→d A→Ab A→b
每次归约的都是句型中的句柄。
22
算符优先分析法
LR分析法
23
1. LR分析法介绍
2. LR(0)分析表的构造
3. SLR分析表的构造
24
从左(Left,L)向右扫描输入串,构造一 个最右推导(Rightmost,R)的逆过程 进行规范归约(最左归约),每次归约 的都是真正的句柄; 对文法限制最少,是识别效率较强的方 法; 出错处理能力较强; 采用自动构造技术(构造LR分析表)
B
e
A
b
d
S → aAcBe A → Ab A→b B→d
b
分 析 树
输入串:abbcde
7
短语 直接短语 句柄
8
定义:设文法G的开始符号为S,是文法 *则称β是 的一个句型,若有SA且Aβ, + 相对于非终结符A的一个短语。 句型
短语是指句型中的某个部分,这部分可以由某 个非终结符推出。 可以利用语法树来找出句型中的所有短语。
查表 A[0,a]=s2,进栈 A[2,a]=s2,进栈 A[2,b]=s5,进栈 A[5,b]=r2,按第2条产生式归约 G[2,A]=3,进入状态3 A[3,b]=s4,进栈 A[4,#]=r1,归约 G[0,A]=1,进入状态1 A[1,#]=acc 31
对于一个文法,如果能够构造一张分析表, 使得它的每个入口均是唯一确定的,则我们 把这个文法称为LR文法。
33
前缀:字的任意首部。即移去符号尾
部零个或多于零个符号得到的一个符
号串。 例:abc的前缀有ε,a, ab, abc

第五章自上而下语法分析

第五章自上而下语法分析

第五章⾃上⽽下语法分析第五章⾃上⽽下语法分析1、教学⽬的及要求:本章介绍编译程序的第⼆个阶段语法分析的设计⽅法和实现原理,包括⾃上⽽下分析的⽆回朔的递归下降分析、 LL(1)分析法。

要求理解递归下降分析、LL(1)⽂法的基本概念;掌握⽆回朔的递归下降分析的设计和实现、LL(1)分析表的构造与分析⽅法。

◇能够对⼀个给定的⽂法判断是否是LL(1)⽂法;◇能构造预测分析表;◇能⽤预测分析⽅法判断给定的输⼊符号串是否是该⽂法的句⼦;◇能对某些⾮LL(1)⽂法做等价变换:①消除左递归②提取左公共因⼦可能会变成LL(1)⽂法。

这样可扩⼤⾃顶向下分析⽅法的应⽤。

2、教学内容:语法分析器的功能,⾃上⽽下语法分析(递归下降分析法,预测分析程序),LL(1)分析法,递归下降分析程序构造,预测分析程序。

3、教学重点:递归下降⼦程序,预测分析表构造,LL(1)⽂法。

4、教学难点:对⼀个⽂法如何判断是否是LL(1)⽂法,由于在判断 LL(1)⽂法时⽤到⽂法符号串的开始符号集合(FIRST集)和⾮终结符后跟符号集合(FOLLOW集)的计算,⽽⼀般学⽣往往因概念不清或不够细⼼对这两个集合的计算常常出错,导致判断和分析结果的错误。

5、课前思考为了了解⾃顶向下(⾃上⽽下)分析的⼀般过程和问题,请学⽣⾸先回顾本章之前介绍的有关基本概念:◇句⼦、句型和语⾔的定义是什么?◇什么叫最左推导?◇什么叫最右推导和规范推导?◇什么叫确定的⾃顶向下语法分析?◇⾃顶向下语法分析是从⽂法的开始符号出发,反复使⽤各种产⽣式,寻找与输⼊符号匹配的推导。

◇确定的⾃顶向下语法分析中⽤的是哪种推导?◇在确定的⾃顶向下语法分析过程中,当以同⼀个⾮终结符为左部的产⽣式有多个不同右部时,如何选择⽤哪个产⽣式的右部替换当前的⾮终结符?◇确定的⾃顶向下语法分析对⽂法有何限制?6、章节内容第⼀节概述第⼆节 LL(1)分析⽅法第三节递归下降分析法5.1 概述LL分析法确定的⾃上⽽下分析⾃上⽽下分析递归下降分析法语法分析不确定的⾃上⽽下分析——即带回溯的分析⽅法算符优先分析⾃下⽽上分析LR分析⼀、带回溯的⾃顶向下分析⽅法是⾃顶向下分析的⼀般⽅法,即对任⼀输⼊符号串,试图⽤⼀切可能的办法,从树根结点(识别符号)出发,根据⽂法⾃上⽽下地为输⼊串建⽴⼀棵语法树,或者说,从识别符号开始,根据⽂法为输⼊串建⽴⼀个推导序列,这种分析过程本质上是⼀种试探过程,是反复使⽤不同规则谋求匹配输⼊串的过程。

编译原理:第五章-语法分析——自下而上分析

编译原理:第五章-语法分析——自下而上分析
• 约定:
• a、b代表任意终结符; • P、Q、R代表任意非终结符; • ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
• 假定G是一个不含-产生式的算符文法。对于任 何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…
或P→…aQb…的产生式
2. a b 当且仅当G中含有形如P→…aR…的产
栈 输入 #S #
考虑文法G(E): E T | E+T T F | T*F F (E) | I
输入串为i1*i2+i3 ,分析步骤为:
步骤 符号栈
0
#
1
#i1
2
#F
3
#T
4
#T*
输入串 i1*i2+i3# *i2+i3# *i2+i3# *i2+i3# i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
• 由第(4)条规则,有 ‘(’ ‘)’; • 由规则E→E+T和TT*F, 有 + *; • 由(2) T→T*F 和(3) F→P F ,可得* ↑; • 由(1)E→E+T和E E+T,可得+ +; • 由(3)F→PF和F PF,可得↑ ↑。 • 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
编译原理
第五章 语法分析—自下而上分析
• 自下而上分析法(Bottom-up)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。

编译原理第三版 第五章 自下而上语法分析

编译原理第三版 第五章 自下而上语法分析
3. 归 (2) 4. 进 b 5. 归 (3) 6. 进 c 7. 进 d 8. 归 (4) 9. 进 e 10. 归 (1)
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号

编译原理 第五章 语法分析-自下而上分析

编译原理 第五章 语法分析-自下而上分析

5.2.2 算符优先分析算法
• 素短语:
–是一个短语,它至少含有一个终结符,并且,除 它自身之外不再含任何更小的素短语。
• 最左素短语:
–最左边的素短语是最左素短语。
• 例子:
– 对文法(5.3)p*p和i是句型p*p+i的素短语,而p*p+i 本身也是素短语。
பைடு நூலகம்
• 算符优先文法:
算符优先文法,我们把句型(括在两个#之间) 的一般形式写成: #N1a1N2a2…NnanNn+1# 其中,每个ai都是终结符,Ni是可有可无的非终结 符。 文法G的任何短语是满足如下条件的最左子串 Njaj…NiaiNi+1 aj-1⋖ aj aj ≖ aj+1 , …,aj-1 ≖ ai ai ⋗ ai+1
– 对于每个终结符a(包括#)令其对应两个符号fa 和ga ,画一张以fa 和ga 所有符号为结点的方向图, 如 果 a⋗≖b, 那 么 , 就 从 fa 画 一 箭 弧 至 gb ; 如 果 a ⋖≖b,就画一条从gb到fa的箭弧。 – 对每个结点都赋予一个数,此数等于从该结点能 到达结点(包括出发结点自身在内)的个数。赋 给fa的数作为f(a),赋给gb的数作为g(b)。 –检查所构造出来的函数f和g,看它们 同原来的关 系表是否有矛盾。如果没有矛盾,则f和g就是所 要的优先函数。如果有矛盾,那么,就不存在优 先函数。
• 例子:假定文法G
S→aAcBe A→b A→Ab B→d 输入串abbcde归约到S过程。
图5.1 规约中符号栈的变迁
步骤 动作
1 进 a
2 进 b
3 归 (2)
4 进 b
5 归 (3)
6 进 c
7 进 d d
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

18
5.2 算符优先分析
一、算符优先文法及优先表构造 1.算符优先文法
算符文法:一个文法,如果它的任一产生式的右部都不 含两个相继(并列)的非终结符,即不含如
式 的产生式右部:
…QR… 则我们称该文法为算符文法。
19
5.2 算符优先分析
假定G是一个不含ℇ-产生式的算符文法。对于任何一对 终结符a、b,我们说: (1) a≖ b 当且仅当 文法G中含有形如 P…ab…或P…aQb…的产生式;
FIRSTVT(S)= {i,+ ,),(}
FIRSTVT(V)= {i,+ ,),(} FIRSTVT(T)= {+,),(}
LASTVT(S)= {i,+,*,(}
LASTVT(V)= {i,+,*,(} LASTVT(T)= {+,*,( }
FIRSTVT(F)= {),(}
LASTVT(F)= { *,(}
(2) T->T*F|F
(3) F->(E)|i
对输入串 i1+i2*i3 的规范归约过程:
16
动作
1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) 12) 13) 14) 15) 准备 移进 归约 归约 归约 移进 移进 归约 归约 移进 移进 归约 归约 归约 接受

输入缓冲区
25
5.2 算符优先分析
按定义,我们可得文法G终结符对的优先关系表,如下所示: (1)EE+T|T + + * ↑ i ( ) # * ↑ i ( ) #
(2)TT*F|F
(3)FP↑F|P (4)P(E)|i
26
按定义,我们可得文法G终结符对的优先关系表,如下所示:
+
+ * ↑ i ( ) # ⋗ ⋗ ⋗ ⋗ ⋖ ⋗ ⋖
(2)若a∈LASTVT(Q), 且有产生式P…Q,则a∈LASTVT(P)。
返回21
5.2 算符优先分析
文法G:(1)EE+T|T
(2)TT*F|F (3)FP↑F|P (4)P(E)|i
FIRSTVT(E)={+, *,↑,(,i} LASTVT(E)={+,*,↑,),i} ↑,(,i} FIRSTVT(T)={*, LASTVT(T)={*, ↑,),i} FIRSTVT(F)={↑, (,i} LASTVT(F)={↑, ),i} FIRSTVT(P)={(,i} LASTVT(P)={ ),i}
LASTVT(P)= { *,(}
i i + * ( ) # ⋗ ⋗ ⋗ ⋗ ⋖ ⋖
+ ⋖ ⋗ ⋗ ⋗ ⋖ ⋖
* ⋗ ⋗ ⋗ ⋗ ≖
( ⋖ ⋖
) ⋖ ⋖
# ⋗ ⋗ ⋗ ⋗ ≖
29
⋖ ⋖
⋖ ⋖
5.2 算符优先分析
二、算符优先分析算法
1.最左素短语 素短语:是指这样的一个短语,它至少含有一个终结符, 个素短语。
“移进”——指把输入串的一个符号移进栈。 “归约”——指发现栈顶呈可归约串,并用适当的相应符号 去替换这个串。 “接受”——指宣布最终分析成功。 “出错处理” ——指发现栈顶的内容与输入串相悖,分析 工作无法正常进行,此时需调用出错处 理程序。
15
5.1 自下而上分析基本问题 例2:有文法:
(1) E->E+T|T
12
(1)
(2)
(3)
(4)
5.1 自下而上分析基本问题
2.规范归约
(2)规范推导:即最右推导。 规范句型:由规范推导所得到的句型,称为规范句型。 若文法G是无二义的,则规范推导(最右推导)的逆过程 必然是规范归约(最左归约)。 (3)规范归约的实质:在移进过程中,当发现栈顶呈现句柄时, 就用相应产生式的左部符号进行替换。 规范归约的中心问题:如何寻找或确定一个句型的句柄。 给出了寻找句柄的不同算法就给出了不同的规范归约方法。
E E E + T + T F
T *
F
i
短语: E+T*F+i, E+T*F, T*F, i 直接短语: T*F, i 句柄:T*F
10
5.1 自下而上分析基本问题
例2:利用句柄对句子进行归约 对文法(1)SaAcBe (2)Ab (3)AAb (4)Bd 句型 abbcd e aAbcde aAcde aAcBe 的句子abbcde进行归约。 归约规则 (2)Ab (3)AAb (4)Bd (1)SaAcBe
(1) E->E+T|T (2) T->T*F|F (3) F->(E)|i
F i3
17
5.2 算符优先分析
算符优先分析: 不是一种规范归约法,是一种自下而上的语法 分析法,关键在于规定算符(即终结符)之间的优 先顺序和结合性质,借助这种优先关系寻找“可归 约串”进行归约。 特点:有利于表达式分析,宜于手工实现。
(3)构造出优先表
23
5.2 算符优先分析
另:‚#”是作为语句的起始和结束标记,认为存在候选式:
#开始符号# (1)# ≖ # (2)# ⋖ FIRSRVT(开始符号) (3)LAVTVT(开始符号) ⋗ #
24
5.2 算符优先分析
例:优先关系和优先表
考虑文法G:(1)EE+T|T
(2)TT*F|F (3)FP↑F|P (4)P(E)|i FIRSTVT(E)= {+, *,↑,(,i} LASTVT(E)={+,*,↑,),i} ↑,(,i} FIRSTVT(T)= {*, LASTVT(T)={*, ↑,),i} FIRSTVT(F)={↑, (,i} LASTVT(F)={↑, ),i} FIRSTVT(P)={(,i} LASTVT(P)={ ),i}
22
5.2 算符优先分析
2.构造优先表
(1)a≖b:找出满足“≖ ”的所有终结符对。
(2)a⋖b,a⋗b:找出满足“⋖”和“⋗”的所有终结符对。
(借助于FIRSTVT(P)和LASTVT(P)实现) a⋖b:有形如…aP…的候选,且∀b∈FIRSTVT(P);
a⋗b:有形如…Pb…的候选,且∀a∈LASTVT(P)。
归约过程如下: d c A a B c A a e B c A a 进 9
a
动作: 进 步骤: 1
b a
A a
b A a 进 4
A a
c A a 进 6
S
进 2
归 3
归 5
进 7
归 8
归 10
4
5.1 自下而上分析基本问题
2.自下而上分析的关键:
“可归约串”——如何精确定义?
从上例的步骤(5)可发现 “可归约串”的不同定义,形成了不同的自下而上的分析方法。
S
11
5.1 自下而上分析基本问题
2.规范归约
(1)定义:设α是文法G的一个句子,那么我们称序列αn, αn-1,…,α0 是α的一个规范归约,若此序列满足: ① αn=α; ② α0=S,S为文法开始符号; ③ 对任何i,0<i≤n,αi-1是经把αi的句柄替换为 相应产生式的左部符号而得到的。 规范归约是关于α的一个最右推导的逆过程。 例: S ⇒ aAcBe ⇒ aAcde ⇒ aAbcde ⇒ abbcde
5.1 自下而上分析基本问题 三、符号栈的使用
1.与LL(1)方法区别:
符号栈 开始 分析成功 # #S 输入串 W# # 符号栈 开始 分析成功 #S # 输入串 W# #
14
LL(1)分析:
5.1 自下而上分析基本问题
2.举例:——规范归约(课本88页例5.3) 语法分析对符号栈的使用有四类操作:
28
5.2 算符优先分析
FIRSTVT(S)= {i,+ ,),(} LASTVT(E)= {i,+,*,(}
FIRSTVT(V)= {i,+ ,),(} FIRSTVT(T)= {+,),(}
FIRSTVT(F)= {),(}
LASTVT(T)= {i,+,*,(} LASTVT(F)= {+,*,( }
例: “算符优先分析”中:“最左素短语”——“可归约串” “规范归约分析”中:“句柄”——“可归约串”
5
5.1 自下而上分析基本问题
3.自下而上分析的中心问题: 怎样判断栈顶的符号串的可归约性以及如何归约。 各种自下而上分析法的共同特点: 边输入单词符号(移进符号栈),边归约。
即:在从左到右移进输入串的过程中,一旦发现栈
30
练习1:
E→E+T | T T→T*F | F F→(E) | i
T+T*F
练习2:
(1)EE+T|T (2)TT*F|F
P*P+i
(3)FP↑F|P
(4)P(E)|i
31
5.2 算符优先分析
句型的一般形式: #N1a1N2a2… aj-1 Njaj…NiaiNi+1 ai+1 … NnanNn+1# #N1a1N2a2… aj-1
5.2 算符优先分析
构造集合FIRSTVT(P):
按定义,我们用以下两条规则构造集合FIRSTVT(P):
(1)若有产生式Pa…或PQa…,则a∈FIRSTVT(P);
(2)若a∈FIRSTVT(Q), 且有产生式PQ…, 则a∈FIRSTVT(P)。
构造集合LASTVT(P):
按定义,我们用以下两条规则构造集合LASTVT(P): (1)若有产生式P…a或P…aQ,则a∈LASTVT(P);
*
⋖ ⋗ ⋗ ⋗ ⋖ ⋗ ⋖

⋖ ⋖ ⋖ ⋗ ⋖ ⋗ ⋖
i
⋖ ⋖ ⋖ ⋖ ⋖
相关文档
最新文档