




已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
硕 士 学 位 论 文ATLAS常规语言部分到C语言的转换Transformation from the general language part of ATLAS to C内 容 提 要本文给出了ATLAS语言的常规语言部分到C语言的转换技术和实现。ATLAS语言是一个面向测试的语言,它被广泛地应用于军事、工业的电子测试领域。它与一般的语言有很多不同之处。本文所处理的ATLAS的常规语言部分类似于一个完整的过程式语言,能够实现一般语言的功能。本文首先对ATLAS语言、项目“ATLAS语言的实现”以及本文主要完成的任务给出了简要的介绍。其次,给出了目前实现一个程序设计语言以及在不同的程序设计语言之间进行转换的常用技术。然后,详细给出ATLAS常规语言部分到C语言的转换。从语义上对ATLAS常规语言部分进行分类,按章节分别给出了ATLAS的声明部分、过程相关语句、数据处理语句、过程控制语句以及输入输出语句到C语言的转换。最后,文中简要介绍了在实现过程中用到的语法分析程序自动生成工具ACCENT、实现转换需要的数据结构以及利用工具ACCENT在产生式级别上实现这部分转换的方法。目 录第一章 前 言11.1 ATLAS语言及项目简介11.2 程序转换技术21.3完成的主要工作3第二章 ATLAS声明部分的转换52.1 ATLAS声明部分简介52.2 转换方法5第三章 过程定义和调用的转换133.1 ATLAS过程简介133.2 转换方法13第四章 数据处理语句的转换174.1 数据处理语句简介174.2 转换方法17第五章 过程控制语句的转换245.1 过程控制语句简介245.2 转换规则24第六章 输入输出语句的转换306.1 输入输出语句简介306.2 转换方法30第七章 实 现427.1 工作环境427.2 转换工具Accent介绍427.3 数据结构437.4 基于产生式的ATLAS转换实现43第八章 总 结48参 考 文 献49致 谢摘 要Abstract1第一章 前言第一章 前 言1.1 ATLAS语言及项目简介1.1.1 ATLAS语言简介ATLAS (Abbreviated Test Language for All Systems)是一个面向测试的通用语言,这个语言用于描述通常与任何具体测试系统无关的测试过程,并确保可以在自动测试系统ATE(automatic test equipment)上实现1。ATLAS语言因其可扩展性、易用性及设备无关性,被广泛应用于军事、工业等领域。早在60年代,ARINC公司为了对航空器上的电子设备系统进行测试,主办开发了一个测试语句ATLAS,那时的ATLAS是指Abbreviated Test Language for Avionics Systems。后来,美国陆军、海军、航空部队以及北大西洋公约组织也加入到这个语言的开发工作中。ARINC委员会于1968年发布了ATLAS语言的第一个标准ARINC4161,此后经过了多次的修改。1976年,ATLAS的控制权由ARINC移交给IEEE,此时ATLAS的含义更为广泛:Abbreviated Test Language for All Systems。就在控制权移交的当年,ARINC发布了IEEE格式的ARINC41613A标准,此后又经过了几十次的修订,使得这个语言变得及其庞大,对它的维护也变得非常困难。1988年,IEEE发布了ATLAS716-1988/9标准,同一年ARINC也发布了ARINC6261988、9标准。IEEE在发布了ATLAS716之后于1993年取消了ATLAS416标准。此后的十几年中,IEEE和ARINC每过三、四年就更新一次各自的标准。2000年,IEEE发布了ATLAS的最新版本ATLAS2000。本文所做的工作就是在标准ATLAS2000的基础上进行的。ATLAS语言从语义上可以分为三大部分:常规语言部分,信号部分和总线部分4。常规语言部分,类似于一个完整的过程式语言,能够实现一般语言的功能,体现了ATLAS语言与其它高级语言的共性;信号部分和总线部分负责描述具体的测试过程,体现了ATLAS语言作为测试语言的特性。ATLAS语言与其它语言相比,具有以下特殊性:1. 语言庞大。此语言的产生式多达两千多条,由于实现ATLAS语言到C语言的转换是在产生式级别上进行操作,因此整个转换过程非常复杂。2. 语句种类多。该语言涉及很多与测试相关的语句,这些语句到C语言没有直接的对应,要转换成C语言编写的格式化函数,来实现这些测试的功能。3. 语法形式繁琐。即使对于一般的过程式语言所具备功能的ATLAS的常规语言部分,在到C语言的转换过程中,也由于ATLAS语句在形式上的繁琐以及两个语言在细节上的很大差别而增加了转换的难度。1.1.2 项目简介 整个ATLAS项目的任务是实现ATLAS语言。整个项目分为三期完成。第一期的工作是完成ATLAS语言的词法分析和语法分析;第二期的工作是进行尽可能多的语义检查,并把ATLAS程序转换成在功能上完全等价的C语言程序;第三期的工作是对转换后的C语言程序进行优化,使其在可读性、可理解性、时间效率和空间效率上都达到比较满意的结果。1.2 程序转换技术1.2.1 程序转换技术简介程序设计语言的研究包括语言的实现、语言的语义描述、语言的转换以及程序的自动生成等内容。不同风格语言之间的程序转换,有助于研究不同语言之间的语义关系,同时也有助于语言的实现。程序转换技术在新型语言的实现中得到了广泛的应用。目前常用的语言实现技术有三种:编译方式、解释方式和转换方式23。通常,实现一种语言有两种方法:一种是直接设计该语言的编译器,另一种是构造一个转换系统,这个转换系统可以把用该语言写的程序等价转换为某一已实现语言的程序,再利用这种语言的编译器使之成为可执行代码。对于一些比较早的语言实现系统,常采用第一种方法,因为当时的语言相对简单,而且没有比较成熟的已实现的软件编译器可用。现在实现一种语言的主流趋势是使用第二种方法。通过转换系统实现语言有如下好处:一、使用一种通用的语言(如C语言)作为中间语言,使得系统具有可移植性;二、简化了要实现语言的实现。由对已有成果的有效利用节约了工作量;综合了已有系统的语义检查,可以增强语言系统的可靠性,另外不需再重复已有编译器的优化功能。 由于程序设计语言多种多样,故目前不存在一套自动的程序转换系统,可以在各种语言之间进行转换。故进行语言转换时,应根据要实现语言的特点,如对象式、过程式、函数式等进行具体的处理。1.2.2 ATLAS语言到C语言的转换方法由于ATLAS的庞大使得直接构造ATLAS的编译器非常复杂。对于ATLAS语言的实现,我们采用转换方式,先把ATLAS语言程序翻译成与之等价的C语言程序,再通过C语言编译器生成可执行程序。ATLAS到C语言的转换在编译技术中可以属于语义处理部分。通常有两种方法进行语义处理,一是语义处理作为独立一遍。这时以语法分析得到的中间结果(源程序的内部表示)作为输入,进行语义操作的处理。二是采用语法制导的方式,即在语法分析用到的产生式中插入语义动作,在语法分析的同时执行语义代码。本文采用第二种方法,使用语法分析程序自动生成工具ACCENT,在ACCENT的语法分析中嵌入语义动作,实现ATLAS到C的转换。1.3完成的主要工作 作为整个ATLAS项目第二期的一部分,本文完成了ATLAS语言的常规语言部分到C语言的转换。完成这部分的转换后,结合C语言的编译器,就可以象使用一般的过程式语言一样,使用ATLAS常规语言部分编写程序(不包括设备和总线的测试功能)。本文的工作主要包括以下几个方面的工作:1. ATLAS的声明部分到C语言的转换;2. ATLAS的过程相关语句到C语言的转换;3. ATLAS的数据处理语句到C语言的转换;4.ATLAS的过程控制语句到C语言的转换;5. ATLAS的输入输出语句到C语言的转换4第二章 ATLAS声明部分的转换第二章 ATLAS声明部分的转换2.1 ATLAS声明部分简介ATLAS的DECLARE声明语句包括三个部分:常量声明语句、类型声明语句和变量声明语句。顾名思义,常量声明语句定义常量标识符以供以后使用;类型声明语句定义类型标识符,以后可以使用此类型标识符定义其它类型或者定义变量;变量声明语句的作用是定义变量标识符以供以后使用。这部分与一般的程序设计语言的含义相同,比较容易理解,不再累述。2.2 转换方法ATLAS的常量声明语句、类型声明语句和变量声明语句可以分别转换成C语言中对应的常量声明语句、类型声明语句和变量声明语句。由于可以直接对应,所以语句级别上的转换比较容易。需要注意的是ATLAS的一条声明语句可以声明多个标识符,因此一条ATLAS语句可能转换成n条C语言的声明语句序列。这一部分的转换难点在于ATLAS各种类型到C语言的转换处理。ATLAS中的预定义类型,记录类型,数组类型,位串类型,枚举类型、连接类型和文件类型到C语言的转换都需要特殊处理。2.2.1 ATLAS的类型到C语言的对应关系ATLAS的类型C的类型说明基类型INTEGERint直接对应C的整数DECIMALfloat直接对应C的实数LONG-DECIMALdouble直接对应C的双精度实数CHARchar直接对应C的字符类型BITchar 1 为了和位串统一处理,将位作为一字节长的字符串处理ENUMERATIONenum 枚举类型名枚举常量序列直接对应C中的枚举类型CONNECTIONenum 枚举类型名枚举常量序列用C中的枚举类型代替预声明类型BOOLEAN枚举 用C中的枚举类型代替CHAR-CLASS枚举用C中的枚举类型代替DIG-CLASS枚举用C中的枚举类型代替结构类型string of charcharlength直接对应C中的字符串string of bitcharlength用C中的0、1字符串代替array基类型 变量名或 基类型 变量名对应C中的数组recordtypedef struct 结构名类型名 变量序列;* 对应C中的结构体file FILE *对应C中的文件类型2.2.2 常量声明的转换ATLAS语句:fstatno DECLARE,CONSTANT,const_id1 IS val1 , ,const_idn IS valn $ 转换规则:转换成C的常量定义序列: const type1 const_id1 = val 1; const typen const_idn = valn ;说明: 1.由于常量声明语句的标号不可能是跳转的目标语句,故转换成C语言之后去掉了没有用处的标号,后面类型声明与变量声明与此相同。2. typei为根据vali得出的常量的类型;3.const_idi是ATLAS中的标识符const_idi转换后的C语言的标识符; 4. vali是ATLAS中的常量值转换后的C语言的常量值。根据具体类型分别转换成不同的C语言的常量声明语句。l INTEGTER类型:const int const_id = val ; l DECIMAL类型:const float const_id = val;l LONG DECIMAL类型:const double const_id = val;l CHAR类型:const char const_id = val;l BIT类型:const char* const_id = val;l 字符串、位串类型:const char* const_id = val;l ENUMERATION、CONNECTION类型、预定义类型:const int const_id = val;说明:由于转换时枚举类型、连接类型、预定义类型都转换为C语言中的枚举类型,而枚举值在C语言中按照整数进行操作,故这里可直接将枚举型和连接型常量声明为整型。l 常量标识符:const type1 const_id = val;说明:根据常量标识符,得到常量的类型type1,转换成上述形式。2.2.3 类型声明的转换ATLAS语句:fstatno DECLARE, TYPE , type_id1 IS type1 , ,type_idn IS typen $ 转换规则:转换成C的类型定义序列: typedef type_id1 type1 ; typdef type_idn typen;说明:1. type_idi是ATLAS中的标识符type_idi转换后的C语言的标识符;2. typei是ATLAS中的类型或者已经定义的类型标识符转换后对应的C语言的类型或类型标识符。根据具体类型分别转换成不同的C语言的类型声明语句。基类型:l INTEGTER类型:typedef type_id int ; l DECIMAL类型:typedef type_id float ;l LONG DECIMAL类型:typedef type_id double;l CHAR类型:typedef type_id char;l BIT类型:typedef type_id char1;l ENUMERATION类型:typedef enum ENUM_element1, ENUM_element2,.,ENUM_elementK type_id ;说明:ATLAS的枚举类型声明到C语言的转换中,将ATLAS中的枚举常量elementi加前缀 “ENUM_”,这样做是为了防止和转换后的连接类型的连接常量重复。l CONNECTION类型:typedef enum CONN_element1, CONN_element2,CONN_elementKtype_id; 说明:ATLAS的连接类型声明到C语言的转换中,将ATLAS中的常量elementi加前缀 “CONN_”。由于ATLAS的连接类型转换成C语言中的枚举类型,因此当ATLAS的连接常量与枚举类型的枚举常量重复时(ATLAS允许),在C语言中会出现枚举常量重复错,通过加入不同的前缀可以解决这个问题。预定义类型:l BOOLEAN类型:typedef type_id bool;l CHAR_CLASS类型:typedef type_id C_CHAR_CLASS; 说明:预定义类型CHAR_CLASS转换为C语言的枚举类型,放在结果文件的开头,声明如下所示:typedef enumISO , ASCII C_CHAR_CLASS;l DIG_CLASS类型:typedef type_id C_DIG_CLASS; 说明:预定义类型DIG_CLASS转换为C语言的枚举类型,放在结果文件的开头,声明如下所示:typedef enumBNR,B1C,B3C,BSM,BCD,SBCD C_DIG_CLASS;结构类型:l 串类型:typedef char type_id 数组长度;l 文件类型: typedef type_id FILE* ;l 记录类型:typedef struct域变量声明1; 域变量声明2; 域变量声明n; type_id;说明: 从记录类型的详细信息ttype中取得记录所有域的域变量字符串和域变量的类型信息,调用函数VarTrans处理域变量声明。l 数组类型:typedef 数组基类型 type_id 数组长度1数组长度2 数组长度n;说明:从数组类型的详细信息ttype中取得数组的基类型、数据的维数以及每维的长度,完成上述转换。2.2.4 变量声明的转换ATLAS语句:fstatno DECLARE, VARIABLE , var_id1 IS type1 , ,var_idn IS typen $ 转换规则:转换成C的变量声明序列: type1 var_id1 ; typen var_idn ;说明:1. var_idi是ATLAS中的标识符var_idi转换后的C语言的标识符;2. typei是ATLAS中的类型或者类型标识符转换后对应的C语言的类型或类型标识符。函数VarTrans算法如下所示:根据具体类型分别转换成不同的C语言的变量声明语句。基类型:l INTEGTER类型:int var_id ; l DECIMAL类型:float var_id ;l LONG DECIMAL类型:double var_id ;l CHAR类型:char var_id ;l BIT类型:char1 type_id ;l ENUMERATION类型: enum ENUM_element1, ENUM_element2,.,ENUM_elementK var_id ;l CONNECTION类型:enum CONN_element1, CONN_element2,CONN_elementKvar_id;预定义类型的处理: l BOOLEAN类型:bool var_id ;l CHAR_CLASS类型:C_CHAR_CLASS var_id ; l DIG_CLASS类型:C_DIG_CLASS var_id;结构类型的处理:l 串类型:char var_id 数组长度;l 文件类型: FILE* var_id ;l 记录类型:struct域变量声明1; 域变量声明2; 域变量声明n; var_id;l 数组类型:数组基类型 var_id 数组长度1数组长度2 数组长度n; 48第三章 过程定义和调用的转换第三章 过程定义和调用的转换3.1 ATLAS过程简介ATLAS和过程相关的语句有三种:过程结构体定义、过程调用语句PERFORM、跳出过程语句LEAVE procedure。过程结构体定义包括过程头、过程体和过程尾。过程头定义过程的名字以及调用过程需要的值参和变参。过程体包含执行某一功能的ATLAS语句序列。过程尾表示过程声明的结束。过程调用语句PERFORM通过与已定义的过程匹配的值参和变参调用过程来完成需要的任务。使用过程跳出语句LEAVE procedure可以在过程正常结束之前跳出过程。3.2 转换方法ATLAS的过程声明转换成C语言中的返回类型为void的函数声明。LEAVE procedure语句转换成C语言的从函数中返回的return语句。PERFORM语句转换成C语言的函数调用。这里转换的重点在于过程的形参和实参的类型为复杂类型,如记录、数据类型时,参数的转换。3.2.1 过程声明的转换规则:ATLAS的过程声明:fstatno DEFINE, P ,PROCEDURE(值参声明1,值参声明n) RESULT(变参声明1,变参声明n)$过程体 END P $转换规则:转换成C的函数声明:void P (值参声明1,值参声明n,变参声明1,变参声明n) 过程体转换后的函数体转换重点:参数转换。1 值参V:若类型为数组或记录,则要在过程转换之前,给数 组或记录定义一个类型名Ti,并将相应的值参声明转换成Ti* V的形式;若类型为位、位串或字符串,则转换成char* V的形式;否则,直接转换成type1 V的形式;2 变参V:若类型为数组或记录,则要在过程转换之前,给数 组或记录定义一个类型名Ti,并将相应的值参声明转换成Ti* V的形式;若类型为位、位串或字符串,则转换成char* V的形式;否则,转换成type1* V的形式。3.2.2 LEAVE procedure语句ATLAS语句: fstatno LEAVE,procedure $语义:跳出正在执行的过程procedure。转换规则:转换成C的return语句 fstatno: return ; 3.2.3 PERFORM语句ATLAS语句:(1) fstatno PERFORM, procedure RESULT ( v1,vn) $(2) fstatno PERFORM, procedure ( e1,en ) $(3) fstatno PERFORM, procedure $(4) fstatno PERFORM, procedure (e1,en) RESULT ( v1,vn) $ 语义:procedure为要调用的过程名标识符,参数v1,vn为值参,跟在RESULT之后的参数r1,rn为变参。转换规则:转换成C的函数调用语句,以(4)为例,转换结果为: fstatno :procedure (e1,en, r1,rn) ;其中,ei为值参ei转换后的结果,ri为rn转换后的结果。转换重点:当ATLAS的参数类型是数组、记录、位串等复杂类型时,根据参数类别是值参还是变参,要进行特殊的转换。具体转换规则如下:值参ei:变参vi:说明:与之对应的变量使用时的处理:1 若变量在过程中,且与某值参的名字相同(使用的是 值参变量),则判断:若变量类型是数组、记录、位、位串、字符串,则将变量V转换成(*V)的形式;否则,仍转换成V。 2 若变量在过程中,且与某变参的名字相同(使用的是变参变量),则判断:若变量类型是数组、位、位串、字符串,则变量V仍转换为V;否则转换为(*V)第四章 数据处理语句的转换第四章 数据处理语句的转换4.1 数据处理语句简介 ATLAS数据处理语句包括CALCULATE语句和COMPARE语句。CALCULATE语句提供进行计算的能力,可以是一条赋值语句,也可以是赋值语句序列。COMPARE语句通过把测试值与规定的极限值进行比较,设置GO,NOGO,HI,LO等标志状态字表示测试结果,以供在后续的测试过程进行使用。4.2 转换方法 CALCULATE语句转换为C语言中的赋值或者赋值序列;C语言中没有直接的比较语句,故COMPARE语句在转换时用C语言的IF语句模拟。在ATLAS数据处理语句到C语言的转换中,处理的重点有:1. 数组变量的赋值和比较;2. 记录变量的赋值和比较4.2.1 CALCULATE语句ATLAS语句:fstatno CALCULATE,datastore1 = expression1, ,datastoren = expressionn $语义:求出“=”右边表达式的值,并将该值赋给“=”左边的变量。在一个CALCULATE语句中,这样的求值和赋值可以进行一次,也可以进行多次。转换规则:转换成C的赋值语句序列: fstatno: datastore1 expression1; datastoren expressionn;说明:(1) fstatno是与fstatno对应的C的标号。ATLAS要求每条语句都必须带有一个标号,这个标号由一个6位的整数表示。我们把每个ATLAS语句标号转换成对应的C语言的语句标号,由于C语言的标号是一个标识符,故我们采用下面的标号转换规则:6位整数 由字母L和前面的6位整数构成的标识符。例: 020130 L020130 (2) datastorei 是datastorei经过转换后的C的变量; (3) expressioni是expressioni经过转换后的C的表达式。 (4)后面其它语句转换中出现的fstatno, datastorei ,expressioni 与这里出现的含义相同。转换重点:(1) 对于位串、位、字符串变量的赋值,不能直接转换成 “=”连接的赋值语句,应该转换成字符串拷贝语句。(2) 对数组变量的直接赋值,转换时应该转换成对所有数组成员逐个赋值的赋值序列。(3) 对记录变量的直接赋值,转换时应该转换成对各记录成员分别赋值的赋值序列。举例:下面给出一个比较复杂的变量赋值,来说明转换重点(1)(2)(3)的转换过程。ATLAS语句为:-000200 DECLARE, TYPE,T1 IS RECORD OF r1 IS INTEGER; r2 IS STRING(10) OF CHAR ; r3 IS ARRAY(0 THRU 2,0 THRU 3) OF INTEGER $ 10 DECLARE, VARIABLE,V1,V2 IS T1 $000300 CALCULATE, V2 = V1 $-转换后的结果为:typedef struct /类型T1声明的转换结果 int r1;char r211;int r334; T1;T1 V1; /变量V1,V2声明的转换结果T1 V2;void main()L000300:V2.r1 = V1.r1; /整数赋值:直接转换strcpy(V2.r2 , V1.r2) ; /字符串赋值:转换成字符串拷贝V2.r300 = V1.r300; /数组赋值:转换成对成员的赋值V2.r301 = V1.r301;V2.r302 = V1.r302;V2.r303 = V1.r303;V2.r310 = V1.r310;V2.r311 = V1.r311;V2.r312 = V1.r312;V2.r313 = V1.r313;V2.r320 = V1.r320;V2.r321 = V1.r321;V2.r322 = V1.r322;V2.r323 = V1.r323;4.2.2 COMPARE语句ATLAS中有两种不同形式的COMPARE语句。(1) fstatno COMPARE,data_store,NOM quanN UL quanH LL quanL $语义:quanH和quanL都是实数量;quanH表示被允许区间的上界值,quanL表示被允许区间的下界值,quanN是参考值。本语句的语义是:若变量的值在quanL和quanH之间,则设置标志状态字GO;若变量的值大于上界值quanH,则设置标志状态字NOGO和HI;若变量的值小于下界值quanL,则设置标志状态字NOGO和LO。转换规则:转换成C的if判断语句:fstatno:if ( (data_store = quantL) ) GO = TRUE; NOGO=FALSE;HI =FALSE;LO=FALSE;else if (data_store quanH) NOGO = TRUE; HI = TRUE; GO=FALSE;LO=FALSE;else if (data_store quant ) GO=TRUE;NOGO=FALSE;HI=FALSE;LO=FALSE elseNOGO = TRUE;LO=TRUE;GO=FALSE;HI=FALSE comp_opLT fstatno:if ( data_store = quant )GO= TRUE;NOGO=FALSE;HI=FALSE;LO=FALSE; elseNOGO=TRUE;LO=TRUE;GO=FALSE;HI=FALSE; comp_opLE fstatno :if ( data_store = quant ) GO = TRUE;NOGO=FALSE;LO=FALSE;HI=FALSE; elseNOGO = TRUE; HI = TRUE;GO=FALSE;HI=FALSE; 说明:(1) quanH, quanL分别是quanH和quanL经过转换后的C的实数量或数字量;(2) GO,NOGO,HI,LO,MAX-TIME是ATLAS中的条件量,C中没有条件量,故用相应的布尔变量代替。当设置条件值时,将对应的布尔变量设置为真,与
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兴化安全管理培训中心课件
- 【含听力7英RJ月考】安庆市太湖县实验中学教育集团2024-2025学年七年级上学期第一次月考英语试卷
- 创新安全培训观念课件
- 创客你我他课件
- 耐药机制阻断策略-洞察及研究
- 统编版语文三年级上册第二单元习作写日记 +公开课一等奖创新教案
- 脑机接口与行为认知的虚拟现实研究-洞察及研究
- 化妆品安全知识培训方案课件
- 兆驰入职安全培训课件
- 软件无线电加密-洞察及研究
- 财务预算培训课件
- 高桩码头施工培训课件
- 砂石加工现场管理制度
- it部门考核方案(3篇)
- 山东C类人员安全考核模拟练习题及参考答案解析
- 中通规章管理制度
- 茶山管理协议书
- 代办土地证协议书
- 创意美术课程教学大纲
- 2025年生物性污染对人体健康的危害与生物安全防控措施
- 现代文献检索与利用3-文献检索技术
评论
0/150
提交评论