编译原理符号表的原理及典型实例 共19页

合集下载

编译原理:第八章 符号表

编译原理:第八章 符号表
规定主程序的层次为1主程序中定义的层次为2依次类推名字的类型类型有整型ints字符型chars布尔型bool数组arrays对于无类型的名字填入notype一个布尔量用于标明名字是否为变量形参名当名字是否为变量形参名时填入false其他情况填入true或不填当名字为数组类型或数组变量名时ref指向该数组在数组信息表中的位置
合肥工业大学 计算机与信息学院软件所
表 0.1 符号名表 SNT NAME INFORMATION M 形式参数,整 型,值参数 N 形式参数,整 型,值参数 K 整型,变量
表 0.2 常数表 CT 值 (VALUE) (1) 1 (2) 4
表 0.3 入口名表 ENT NAME INFORMATION (1) INCWAP 二目子程序, 入口四元式:1

ax→
数组下限 数组上限 数组元素的体积 数组本身的体积 当元素为数组时,它指向 数组元素类型 数组的下标类型 该元素数组信息在atab表 中的位置,其他情况为0
合肥工业大学 计算机与信息学院软件所
type a=array[1..10, 1..10] of integer;
name kind typ ref
合肥工业大学 计算机与信息学院软件所
PL 语言编译程序的符号表
1. 表格的定义 名字表(nametab) 程序体表(btab) 层次显示表(display) 数组信息表(atab) 中间代码表(code)
合肥工业大学 计算机与信息学院软件所
1) 名字表(nametab) 名字表nametab:登记程序中出现的各种名 字及其属性
lastpar last psize vsize 0 1

bx→
指向本程序体中最后一个形式参在 本程序体所有局部数据所 指向本程序体中最后一个名字在 本程序体所有形参所需体积、包 nametab 中的位置 需空间大小 nametab 中的位置 括连接数据所占空间

编译原理 第四章 符号表

编译原理 第四章 符号表

4.4.2 符号表的查填
1)隐式说明语言的符号表查填 2)显示说明语言的符号表查填
4.4.3 符号表的删除
当不再使用单词的定义时,需要从符号表中删除单词 定义提供的信息。
4.3.2 常用符号表结构
1)无序符号表 2)有序符号表 3)散列表 4)树结构符号表 5)栈符号表
4.4
符号表的管理
4.4.1 符号表的初始化
1)对于静态符号表,当编译程序开始扫描程序时,符号表 是预先构造好并存于内存的。 2)对于动态符号表,如标识符表、标号表、数值信息表等, 是编译程序在编译过程中根据需要构造的。
第四章 符号表
4.1
符号表的地位及作用
符号表是编译程序的一个主要数据结构,符 号表通常与编译程序的各个阶段有关,编译程序 的各阶段需要不断向符号表输入信息,或者通过 它消除二义性。
符号表的作用可归结为以下几个方面: ① 收集单词属性 ② 语义的合法性检查 ③ 地址分配的依据
4.2
单词的属性及符号表的内容4. Nhomakorabea.1 单词的基本属性
1)保留字的属性 2)特殊符号的属性 3)常量的属性 4)标识符的属性
4.2.2 标识符的处理
1)标识符的定义性出现与应用性出现 2)标识符的作用域
4.2.3 符号表的内容
4.3
符号表的组织
4.3.1 符号表的总体组织
1)将所有语言中的单词都组织在一张符号表中 2)将属性完全相同的那些单词组织在一起 3)将单词属性相似的单词组织在一起

编译原理 符号表6

编译原理 符号表6

第8章 符号表与错误处理 例8.1 一示意性源程序如下: PROGRAM PP (input,output); COUNT norw=13;
VAR ll,kk:integer; word:ARRAY[1..norw] OF char;
PROCEDURE getsym; VAR i,j: integer; PROCEDURE getch; BEGIN END; {getch} BEGIN
第8章 符号表与错误处理
这样,在从左至右扫描源程序时就可以按分程序在源 程序中的这种自然顺序(静态层次),对出现在各个分程 序中的标识符进行处理,具体方法如下: (1) 当在一个分程序首部某说明中扫描到一个标识符时 ,就以此标识符查找相应于本层分程序的符号表,如果 符号表中已有此名字的登记项,则表明此标识符 已被 重复说明(定义),应按语法错误进行处理;否则,应在 符号表中新登记一项,并将此标识符及有关信息 (种属、类型、所分配的内存单元地址等)填入。
第8章 符号表与错误处理
j:=1; kk:=i+j END; {getsym} BEGIN END.{pp}
第8章 符号表与错误处理
当编译程序扫描上述源程序时,生成栈式符号表, 试就此符号表回答以下问题:
画出“扫描到getsym过程体之前”的栈符号表; 画出“扫描完getsym过程说明(即扫描完END; {getsym})”时的栈符号表。 [解答] 假定所有的名字在数据区中都只需要一个 单元。 “扫描到getsym过程体之前”的栈符号表如图8- 5 所示。 “扫描完getsym过程说明”时的栈符号表如图8- 6 所示。
度固定的表格易于组织、填写或查找, 因而是最简单的一 种符号表组织方式,
第8章 符号表与错误处理

编译原理课件-符号表

编译原理课件-符号表
查詢表項
在引用聲明過的識別字時進行
修改表項
在獲得新的語義值資訊時進行
刪除一個或一組無用的項 釋放符號表的空間
在編譯結束前或退出一個分程式
符號表的組織
總體組織和表項屬性資訊組織 第一種: 把屬性種類完全相同的那些符號組織
在一起,構造出多個符號表,常數表、變數名 表、過程名表,標號表 第二種: 把所有語言中的符號都組織在一張符 號表中。組成一張包括了所有屬性的龐大的符 號表 第三種:。。。
上下文語義的合法性檢查的依據
在語義分析中,符號表所登記的內容將用於語義檢查(如檢查一 個名字的使用和原先的說明是否一致)和產生中間代碼。
目標代碼生成階段地址分配的依據
在目標代碼生成階段,當對符號名進行地址分配時,符號表是地 址分配的依據。對一個多遍掃描的編譯程序,不同遍所用的符號 表也往往各有不同。因為每遍所關心的資訊各有差異。
符號表項的排列
符號表作為一個多元組,表中元組的排列組織 是構造符號表的重要成分。在編譯程式的整個工 作過程中,符號表被頻繁地用來建立表項,查找 表項,填充和引用表項的屬性。因此表項的排列 組織對該系統運行的效率起著十分重要的作用。 在編譯程式中,符號表項的組織傳統上採用三種 構造方法。即線性法,二分法及散列法。
根源程式
詞法分析器
單詞符號

語法分析器


語法單位


語義分析與中間代碼生成器

中間代碼


代碼優化
中間代碼

目標代碼生成器
目標代碼
符號表
符號表是一種數據結構,用來保存根源程 式語言中的各種資訊,如記錄名字的作用 域以及綁定資訊。
在編譯過程不斷彙集和查證出現在根源程 式中的各種單詞的語義屬性特徵資訊。

《编译原理符号表》PPT课件

《编译原理符号表》PPT课件

精选课件ppt
26
符号表的总体组织
属性3栏与属性4栏冗余,可将其合并;
增加了符号表管理和运行的复杂性,但减少了空间开销;
精选课件ppt
27
符号表的总体组织
总结:
为便于符号表的组织管理,每张符号表的表长通常为定 长是合理的;
每张符号表可以看作是一个多元组,每个元组由若干属 性组成,元组之间有相同的成员个数和一致的排列;
下推链域的组织
精选课件ppt
40
等长属性值域组织
可以取相应的数据类型表达属性值
符号布尔性质的属性域
defined 1(true) 表示已定义
defined 0(false) 表示未定义
表示符号的基本数据类型
Data-type 3个bit位(整型值)
Char
0 0 0 (0)
short
散列组织
对符号进行某种函数操作(杂凑函数)所得的函数值确 定它在符号表的位置;
Vhash = fhash(符号代码值)
改进:Lhash = mod(Vhash,N) ……….. …a…… ……..b.. …..a….. ……..d.. …c……. ……b….
精选课件ppt
33
符号表项的排列
▪ 函数外表示文件可视性,函数内表示所在函数可视;
动态存储区:生命周期是定义该变量的局部范围;
精选课件ppt
15
标识符符号的属性(信息)
具体位置:
按该变量在存储区类分别依出现先后的次序排列下 相对该存储区表头的相对位移量来表示的;
… Int a; …. float b; … Struct cc{
元组之间的区分由表项中“符号”一栏区分;
精选课件ppt

编译原理符号表的原理及典型实例

编译原理符号表的原理及典型实例

05
符号表的设计与实现
符号表的数据结构设计
符号表的数据结构应满足高效、 易扩展和易维护的要求,通常 采用哈希表、二叉树等数据结
构实现。
符号表应包含符号名称、符 号类型、符号属性等信息, 以便在编译过程中快速查找
和识别符号。
符号表还应支持动态添加、删 除和修改等操作,以适应源代
码中符号的变化。
符号表的实现算法
常量名的符号表实例
总结词
常量名符号表实例展示了如何使用符号表来管理程序中的常量。
详细描述
常量名符号表记录了常量的名称、类型和值等信息。通过符号表,编译器能够方 便地查找常量的定义和使用,并进行相应的语义分析和代码生成。在处理常量时 ,符号表有助于编译器优化程序的性能,例如常量折叠和常量传播等。
04
编译原理符号表的原 理及典型实例
目录
• 编译原理符号表概述 • 符号表的原理 • 符号表的典型实例 • 符号表在编译过程中的应用 • 符号表的设计与实现
01
编译原理符号表概述
符号表的概念
符号表是一种用于存储程序中标识符 信息的数据结构,主要用于编译过程 中对标识符进行跟踪和管理。
符号表中的每个条目都包含有关标识 符的信息,如名称、类型、作用域等。
如果符号表中存在该标识符的信息,编译器就可以 使用这些信息来生成相应的代码。
符号表的更新
01
在编译过程中,符号表可能会被更新以反映源代码的变化。
02
当源代码中添加、删除或修改标识符时,符号表中的相关信息
也需要相应地更新。
更新符号表的过程通常涉及到在哈希表中插入、删除或修改相
03
应的条目。
03
符号表的典型实例
典型实例

编译原理课件第九章符号表

编译原理课件第九章符号表
SUBROUTINE INCWAP(M,N) 10 K=M+1
M=M+4 N=K
RETURN
END
经编译头三阶段后所产生的主要表格有:符号 名表SNT、常数表CT、入口名表ENT、标号 表LT和四元式表QT
符号名表SNT
NAME (1)M (2)N (3)K
INFORMATION 哑元,整数,变量 哑元,整数,变量 整数,变量
在整个编译期间,对于符号表的操作大致可 归纳为五类:
• 对给定名字,查询名字是否已在表中;
• 往表中填入一个新的名字;
• 对给定名字,访问它的某些信息;
• 对给定名字,填写或更新它的某些信息;
• 删除一个或一组无用的项。
不同种类的表格所涉及的操作往往也是不同 的。上述五个方面只是一些基本的共同操 作。
.在符号表的信息栏中引入一个指针域(previous)用以链接它在同一过程内 的前一域名字在表中的下标(相对位置)。每一层的最后一个域名字,其 previous 之 值 为 0 。 这 样 , 每 当 需 要 查 找 一 个 新 名 字 时 , 就 能 通 过 DISPLAY找出当前正在处理的最内层的过程及所有外层的子符号表在栈 符号表中的位置。然后,通过previous可以找到同一过程内的所有被说明 的名字。
常Байду номын сангаас表CT
值(VALUE) (1) 1 (2) 4
入口名表ENT
NAME
INFORMATION
(1)INCWAP 二目子程序,入口QT(1)
/*记录入口名INCWAP的入口地址*/
标号表LT
LABLE INFORMATION
(1)10
QT(4)
/*记录了标号10对应的四元式序列号*/

编译原理第八章 符号表

编译原理第八章  符号表
• 需要做作用域分析!
8.3 名字的作用范围(Fortran)
• Fortran 局部、全局
• 执行时过程(函数)不
Name
Information
嵌套,局部区域只有一
···

个现行段;
···
部 • 编译时,尽管查填符号
表过程只限于局部,但
考虑到地址分配的全局
性,需将每个程序段符
号表保存在外存中,采
• 定长方式 • 间接方式 (1)名字的间接存储 (2)信息的间接存储
Name ● ●
Information
如何组织
方式
6 S A MP L E 3 S U M
Name
Information ● ●
数组信息表 维数 首地址 维1
内情向量表
··· ···
以数组为例 维n
如何组织
• 对于名称:把所有标识符都存放在一个 独立的字符串数组,主栏只放一个指示 器和一个整数(名字的长度)
var f, g: real; procedure B3(y:real) const b=5; procedure B4 … end B4 end B3
end B2 end B1
8.3 名字的作用范围 (Pascal)
top
(14)…
B4 (13)…
0
h (12)… 13
sp b (11)…
12
y (10)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希

表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识

符号表原理介绍(详细)

符号表原理介绍(详细)

§6.2 符号的主要属性及作用
例: int a; float b; struct cc{ int d; float e; // 外部定义的整型变量a // 外部定义的实型变量b // 外部定义的结构类型cc, cc的第一个结构分量d // cc的第二个结构分量t … // 外部定义的结构型变量c
编译程序分析到下述两个说明语句int则在符号表中收集到关于符号a的属性是一个整型变量关于符号b的属性是具有5个浮点型元素的一维数61二上下文语义的合法性检查的依据同一个标识符可能在程序的不同地方出现而有关该符号的属性是在不同情况下收集的
编译原理
第六章 符号表
§6.1 符号表的作用和地位
在编译程序中符号表用来存放语言程序中出现的有关 标识符的属性信息 属性信息,这些信息集中反映了标识符的语 属性信息 语 义特征属性。 在词法分析 语法分析 词法分析及语法分析 词法分析 语法分析过程中,不断积累和更新表中 的信息。 在词法分析到代码生成的各阶段 各阶段,按各自的需要从表 各阶段 中获取不同的属性信息。
§6.2 符号的主要属性及作用
外部变量)被指定分配到该公共静态存储区 公共静态存储区中。 公共变量(外部变量 公共变量 外部变量 公共静态存储区 C/C++中的外部变量就属于这类共静态存储区的分配。在公共静 态区中的变量具有的生命周期是该程序运行的全过程,且其作用 域亦是整个语言程序。 编译程序为局部静态量 局部静态量可设立若干个局部静态区 局部静态区。 局部静态量 局部静态区 对外部静态量 外部静态量,为每个程序文件建立一个局部静态区,对内部静 外部静态量 内部静 态量,则为每个具有内部静态量定义 具有内部静态量定义的函数或过程,建立一个局 态量 具有内部静态量定义 局 部静态区。 部静态区 被Static所定义的符号变量具有的生命周期也是该程序运行的全 过程。但被Static定义的变量若在函数之外则为所在之文件中所 有函数可视。而若变量在函数内被定义为Static,则它仅为所在 函数可视。分别分配不同的静态变量,这仅是编译处理上的问题, 与语言无关。

精品课程《编译原理》PPT课件第9章 符号表

精品课程《编译原理》PPT课件第9章  符号表

RINFL[rp]:
域名部分 区距部分
FTP是域类型部分
一个记录类型要占几个RINFL表项, 不同记录类型所占表项个数不一,而 在表项中没有链接部分,因此在不同 记录的RINFL表之间可放置一条空项, 以表示记录类型的RINFL表中的结束。
综上所述,我们有: TYPEL表 integer: i
real: r b a
临时变量 局部变量 DISPLAY表 形式参数2 形式参数1 过函名 管理信息
l+ 1 5 4 3 0-2
抽象地址的变化规律可图示如下:
实在声明:
(l,off) <标号声明部分> (l,off) (l,off) <常量声明部分> (l,off) (l,off) <类型声明部分> (l,off)
在整个编译阶段都离不开符号表。 二、符号表的内容 0 Pascal 有以下几种类型: 整 型:integer 实 型:real 布尔型:boolean 数组型:ARRAY[N1…N2]OF T 记录型:RECORD id1:T1;…; idn;Tn END
类型表TYPEL结构形如: TCLASS
三、标识符的作用域与处理 程序段:PROGRAM…………………END 过程段:PROCEDURE………………END 函数段: FUNCTION………………END 记录类型: RECORD………………END
具体实现方法可分为两种: 真删除法
加标记法
9.4 抽象地址的处理
存储分配分为静态分配与动态分配。 在编译时分配的称静态分配。 在目标程序运行时分配的称动态分配。
2.若ICLASS.t=1,则IADDR是类型长度 3.若ICLASS.v=1.则IADDR是形如: LEVEL OFF 的抽象地址,其中LEVEL 是层数,OFF是区距部分。

编译原理:第10章 符号表

编译原理:第10章 符号表

编译原理仅用于教学第10章 符号表第10章 符号表◆ 符号表的作用 ◆ 符号表的内容 ◆ 符号表的组织 ◆ 栈式符号表学习目标„ 掌握 „ 符号表的作用 „ 符号表的内容 „ 符号表的组织方法 „ 栈式符号表10.1 概述1.符号表的作用 符号表在整个编译期间的作用主要有两条:一是辅助语义的(即上下文有关的)正确性检查;二是辅助代码生成。

2.符号表的生存期 符号表的建立可以开始于词法分析阶段(有些内容初始建立),也可以放到语法语义分析阶段,但符号表的使用, 有时会延续到目标代码的运行阶段(如运行时刻为了诊断的 需要,数组下标地址计算的需要等)。

10.2 符号表的内容◆ 标识符的名字 ◆ 与标识符有关的信息不同的标识符在符号表中具有不同的信息: ⅰ.数组——信息向量表(内情向量表) ⅱ.记录——域紧接着相应的记录变量名字相继存放 ⅲ.过程或函数——参数的个数、类型、次序、是否允 许递归等10.2 符号表的内容① 类型信息 包括种类(常量、变量、数组、标号、函数或过程等)与属性(整型、实型、字符型、布尔型等)。

② 地址码ⅰ.简单变量/常量——在数据区中的绝对或相对地址 ⅱ.数组——在数据区中的首地址 ⅲ.过程或函数——过程或函数的分程序入口地址 ③ 层次信息——标识符所属分程序(过程)的静态层次 ④ 行号信息——标识符在源程序中的行号(说明行与引用行)110.3 符号表的结构与组织1.符号表的结构 线性符号表、树结构、散列表或桶等。

2.符号表的组织 符号表的条目一般由两部分组成,即名字栏与信息栏。

通常,条目用连续的存储字构成的记录来实现。

为保持符号表条目记录的统一,往往把与名字相关联的构造类型等 信息保存在符号表的某处(如数组的信息向量表等),而把相 应的指针或序号放在记录内。

10.3 符号表的结构与组织3.符号表的操作 大量的查找、填表与删除等操作。

10.4 栈式符号表——PASCAL符号表的设计1.语言的特点PASCAL按照最近嵌套作用域原则,一个名字的作用域 是那个包含了这个名字的说明的最小过程或函数。

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

{
int a=2;
B2
printf(“%d,%d\n”,a,b);
}
B0
B1
{
B3
}
int b=3; printf(“%d,%d\n”,a,b);
printf(“%d,%d\n”,a,b);
}
printf(“%d,%d\n”,a,b);
}
NULL
a b
B0的符号表
B1的符号表
b
int main() {int a=0; int b=0; { int b=1;
编译原理
第九章 符号表
第九章 符号表
在编译程序工作的过程中,需要不断收集、 记录和使用源程序中一些语法符号的类 型和特征等相关信息。这些信息一般以 表格形式存储于系统中。如常数表、变 量名表、数组名表、过程名表、标号表 等等,统称为符号表。
对于符号表组织、构造和管理方法的好 坏会直接影响编译系统的运行效率。
nametab
tx→
inxtyp eltyp elref low high elsize size

atab
n ints arrays m 1 10 10 100

m ints ints 0 1 10 1 10
ax→
三、符号表的组织
按照属性种类完全相同的那些符号组织 在一起;
把所有语言中的符号都组织在一张符号 表中;
根据符号属性相似程度分类组织成若干 张表,每张表中记录的符号都有比较多 的相同属性。
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 属性1 属性2 属性3 第二类符号 属性1 属性2 属性4 第三类符号 属性2 属性5 属性6
第一种组织法:按属性分类
优点:管理一致,空间效率高 缺点:管理复杂
{ int a=2; printf(“%d,%d\n”,a,b);
} { int b=3;
printf(“%d,%d\n”,a,b); } printf(“%d,%d\n”,a,b); } printf(“%d,%d\n”,a,b); }
B2的符号表
a
B3的符号表
b
谢谢
四、符号表的数据结构
散列表——符号表项的位置由对该符号进行 某种函数操作所得到的函数值来确定
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
五、符号表与作用域
int main()
{
int a=0;
int b=0;
{
int b=1;
二、符号表的内容 例:Pascal语言的名字信息表nametab
type a=array[1..10, 1..10] of integer;
name kind typ ref
k a type arrays n
nametab
tx→
二、符号表的内容
例:Pascal语言的数组信息表atab
inxtyp eltyp elref low high elsize size 1 2

ax→
数组的数下组标元类素型类型当该元元数素素组为数下数组数数限组信组组数时息上元组, 在限素本它at的a身指b体的向表积体积 中的位置,其他情况为0
type a=array[1..10, 1..10] of integer;
name kind typ ref
k a type arrays n
一、符号表的作用和功能
收集符号属性 上下文语义的合法性检查的依据 作为目标代码生成阶段地址分配的依据
例:C语言程序段:int a; a=1;
MOV #1,R0 MOV R0,mema
词法分析:a是一个单词; 语法分析:a出现在一条变量声明语句和一条赋 值语句中;
语义分析:a是一个整形变量,并分配地址。
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 属性1 属性2 属性3 第二类符号 属性1 属性2 属性4 第三类符号 属性2 属性5 属性6
第二种组织法:单一组织 优点:管理一致,集中单一 缺点:管理复杂
三、符号表的组织
假设有下列三类符号及其所需属性
第一类符号 属性1 属性2 属性3 第二类符号 属性1 属性2 属性4 第三类符号 属性2 属性5 属性6
二、符号表的内容
标识符的名字 与标识符有关的信息
类型信息(包括种类和属性) 地址码 层次信息 行号信息 ……
二、符号表的内容
例:Pascal语言的名字信息表nametab
name kind lev typ normal ref adr/val/size link
0 1 tx→
当组在名信程名字息序中址avs字名(类a分di为表体zclre,,类o,当字型当数中表标当的n名名 (于名名c存(种组 的s字字tbh一 名 其识字字 无贮ty为为ta类位a为p单a个 , 他 变n变的 类r符e类名 定 义b元,型 置st量量指在n为)型))布 当 情的)类 型、a名中、字主的名、可或;名n0向相m时尔名况时型的a过时的变所程层对布同以e数当,m(包,地t量字填,名程填a位量在序次一e尔是括组名填址bt入,是入类字a形入程(;中置(的的为型常他变字pbv参该对用否t序型填登中r们a;程层2r(,类量为o于urb的,体记的于为存有入型ic过其序次eoa相名过e入中数的位程依或ob标变整n应d他体为该据名时程l定o第置值)eu次不明量变所型,、情t的1)r义,名一,y量需、填e类,填名形(数p况(静的存)个每i入或时rne推主e字参贮他形组上名个tr态f,s单e们指参程是 名一字程()f元层相)a、r为在向序个e的否 时的序应r次相rf字数0代名该指a体l中应为 填i目码。ny符活字在数向k定的s变 入动规)型入组该,记量f口a录在过对地l形se数程参,
第三种组织法:折中方法
ห้องสมุดไป่ตู้
四、符号表的数据结构
线性表——符号表项按照符号被扫描到的先 后顺序登录
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
四、符号表的数据结构
有序表——符号表项按照符号的字符代码串 的值的大小排列
………………… …a…………… …………b…… …a…………… …………d…… …c…………… …………b…… ……
相关文档
最新文档