属性文法和语法制导翻译.ppt_第1页
属性文法和语法制导翻译.ppt_第2页
属性文法和语法制导翻译.ppt_第3页
属性文法和语法制导翻译.ppt_第4页
属性文法和语法制导翻译.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第六章属性文法和语法制导翻译,6.1 属性文法 6.2 基于属性文法的处理方法 6.3 S属性文法的自下而上计算 6.4 L属性文法和自顶向下翻译 6.5 自下而上计算继承属性,2,2020/9/29,中南大学软件学院 陈志刚,6.1 属性文法 概述 语义处理,程序设计 语言的语义 静态语义是对程序约束的描述,这些约束无法通过抽象语法规则来妥善地描述,实质上就是语法规则的良形式条件,它可以分为类型规则和作用域/可见性规则两大类 类型相容性 变量先声明后引用 名称相关要求 动态语义 程序单位描述的计算 编译程序的语义处理工作 静态语义审查 解释执行动态语义(计算)生成代码.,3,2020/9/2

2、9,中南大学软件学院 陈志刚,概述,语义形式化 语义建模 文法模型- 属性文法 命令式或操作式模型 - 操作语义学 应用式模型-指称语义学 公理式模型-公理语义学,4,2020/9/29,中南大学软件学院 陈志刚,属性文法,表达式文法 ET+T| T or T Tn | b ET1 + T2 T1.type = int T2.type= T1.type E.type :=int E T1 or T2 T1.type = bool T2.type= T1.type E.type :=bool T n T.type := int T b T.type := bool,5,2020/9/29,中南大

3、学软件学院 陈志刚,操作语义,描述一段程序的含义是通过执行该段程序所改变的计算机(虚拟计算机)状态来反映。这个计算机的状态与程序执行时的状态相对应:包括变量的所有值,可执行程序本身,各种系统定义的内部数据结构。计算机里所有的寄存器的值和存储单元的值作为计算机的状态,用一组形式定义的操作来说明执行一条指令相应的状态怎样变化。 For (expr1;expr2;expr3) expr1; . Loop:if expr2=0 goto out expr3; goto loop out: .,6,2020/9/29,中南大学软件学院 陈志刚,公理语义,一个语言的每个语法成分的含义定义为公理和演绎规则,

4、用于推导出该成分执行的效果。 公理语义概念是随着程序正确性的证明而发展的。当正确性证明能构造时表明程序执行它的规格说明所描述的计算。在一个证明中,每一个语句之前之后都有一个逻辑表达式对程序的变量进行约束,以此说明这个语句的含义。 一般的记号 P S Q 如果在语句S执行前P为真,则在语句S执行并终止后Q为真。,7,2020/9/29,中南大学软件学院 陈志刚,指称语义,指称语义的基本概念是给每一段程序实体定义一个数学意义上的对象,和一个从实体实例向数学意义对象的映射的函数 特点: 不但对全部程序赋予全文而且对程序设计语法每一个语法成分短语(表达式,命令,声明) 都给予含义。 每一个语法成分(短

5、语)的含义是以它的自 成分的含义的术语来定义的。 即 语义结构 平行于语法结构。 语义函数: 程序设计语言的语义利用映射函数来证明。 语义函数将短语映射到它的指称。,8,2020/9/29,中南大学软件学院 陈志刚,属性文法,虽然形式语义学(如指称语义学、公理语义学、操作语义学等)的研究已取得了许多重大的进展,但目前在实际应用中比较流行的语义描述和语义处理的方法主要还是属性文法和语法制导翻译方法,9,2020/9/29,中南大学软件学院 陈志刚,属性文法,属性文法(attribute grammar)是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法 V:有穷的属性集,每个属性与

6、文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息,如它的类型、值、代码序列、符号表内容等等 .属性与变量一样,可以进行计算和传递。属性加工的过程即是语义处理的过程。 F:关于属性的属性断言或一组属性的计算规则(称为语义规则) . 断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性.,10,2020/9/29,中南大学软件学院 陈志刚,属性有两种 继承的和综合的属性,属性通常分为两类:综合属性和继承属性。简单地说,综合属性用于“自下而上”传递信息,而继承属性用于“自上而下”传递信息。 出现在产生式左边的继承属性和出现在产生式右边的综合属性不由所给定

7、的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算或者由生计算器的参数提供。 AX1 X2 Xn A的综合属性,计算 S(A):=f(I(X1),I(Xn) Xj的继承属性,计算 T(Xj):=f(I(A),. I(Xn) 1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性. 2)终结符只有综合属性.,11,2020/9/29,中南大学软件学院 陈志刚,在一个属性文法中,对应于每个产生式A都有一套与之相关联的语义规则,每条规则的形式为b:=f(c1,c2ck) 这里,f是一个函数,而且或者 (1)b是A的一个综合属性并且c1,c2ck是产生式右边文法符号的属性;或

8、者 (2)b是产生式右边某个文法符号的一个继承属性并且c1,c2ck是A或产生式右边任何文法符号的属性。 在两种情况下,我们都说属性b依赖于属性c1,c2ck 。,12,2020/9/29,中南大学软件学院 陈志刚,一个属性文法的例子 例6.1 非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性,它的值由词法分析器提供。与产生式LEn对应的语义规则仅仅是打印由E产生的算术表达式的值的一个过程,我们可认为这条规则定义了L的一个虚属性。某些非终结符加下标是为了区分一个产生式中同一非终结符多次出现,语 义 规 则,L E,E E1+T,E T,T T1 * F,T F,F (E)

9、,F digit,Print(E.val),E.val:=E1.val+T.val,E.val:=T.val,T.val:=T1.val F.val,T.val:=F.val,F.val:=E.val,F.val:=digit.lexval,产 生 式,13,2020/9/29,中南大学软件学院 陈志刚,设表达式为35+4,则语义动作打印数值19,L,E.val=19,E.val=15,T.val=4,T.val=15,F.val=4,T.val=3,F.val=3,F.val=5,digit.lexval=4,digit.lexval=5,digit.lexval=3,+,*,3*5+4的带

10、注释的分析树,14,2020/9/29,中南大学软件学院 陈志刚,继承属性,一个结点的继承属性值是由此结点的父结点和/或兄弟结点的某些属性来决定的。 例6.2 继承属性L.in,生 产 式,语 义 规 则,D TL,T int,T real,L L1,id,L id,L.in:=T.type,T.type=integer,T.type:=real,L1.in:=L.in,addtype(id.entry,L.in),addtype(id.entry,L.in),15,2020/9/29,中南大学软件学院 陈志刚,D,L.in= real,L.in= real,L.in= real,T.type

11、=real,real,id2,id1,id3,.,Real id1,id2,id3,,,,,16,2020/9/29,中南大学软件学院 陈志刚,语法制导的翻译,一个翻译是符号串对的一个集合。在一个编译程序定义的翻译中,符号串对是源程序和目标程序。各个编译阶段定义一个翻译,词法分析:(字符串,单词串)语法分析:(单词串,语法树)代码生成(语法树,汇编语言) 设是输入字母表且是输出字母表。定义由语言 L1 *到语言L2 *的一个翻译是由*到 *的一个关系T,使得T的定义域为L1且T的值域为L2 。 使(x,y) T的句子y叫做x的一个输出.,6.2 基于属性文法的处理方法,17,2020/9/29

12、,中南大学软件学院 陈志刚,语法制导的翻译,直观地说,一个语法制导翻译的基础是一个文法,其中翻译成分依附在每一产生式上。 例6.3: 下列翻译模式,它定义翻译,即对每个输入x,其输出y是x的逆转。定义此翻译的规则是,产生式,翻译规则,(1)s0s,(2)s1s,(3)s ,(1)s=s0,(2)s=s1,(3)s=,18,2020/9/29,中南大学软件学院 陈志刚,输入输出对可由(,)表示,其中是输入句子形式而是输出句子形式。 (S,S)开始用产生式s0s来扩展得到(0S,S0). 再用一次规则(1),得到(00S,S00)。 再用规则(2),就得到(001S,S100). 然后应用规则(3

13、)并得到(001,100)。,19,2020/9/29,中南大学软件学院 陈志刚,例6.4: 把下述产生式定义的算术表达式映射到后缀波兰表示:,EE+T,E T,T TF,T F,F (E),F a,E=ET+,E=T,T=TF,T=F,F=E,F=a,产生式,翻译规则,20,2020/9/29,中南大学软件学院 陈志刚,确定输入a+aa的输出: (E,E)(E+T,ET+) (T+T,TT+) (F+T,FT+) (a+T,aT+) (a+TF,aFF+) (a+FF,aFF+) (a+aF,aaF+) (a+aa,aaa+),21,2020/9/29,中南大学软件学院 陈志刚,定义: 一个

14、语法制导的翻译模式是一个五元组T=(N,,R,S),其中 (1) N是非终结符的有限集。 (2) 是有限的输入字母表。 (3) 是有限的输出字母表。 (4) R是形如A,的规则的有限集,其中 (N )*,(N )*且中那组非终结符是中那组非终结符的置换。 (5) S是N中一个特别的非终结符,即开始符。,22,2020/9/29,中南大学软件学院 陈志刚,定义: 若T= (N, R,S)是SDTS,(T)则称为语法制导的翻译(SDT),文法Gi=(N, ,P,S),其中P=A|A,属于R),称为SDTS T的基础(或输入)文法。文法G0=( N, ,P,S), ,其中P =A | A,属于R ,

15、称为T的输出文法。 把语法制导的翻译方法看成是将输入文法Gi中的推导树变换成输出文法G0中的推导树。给了输入句子x,可以按如下方式得到x的一个翻译:先为推导x构造一棵推导树,再变换该树到输出文法中的一棵树,然后取此输出树的边缘作为x的一个翻译。,23,2020/9/29,中南大学软件学院 陈志刚,语义制导翻译中的规则A,对应于每一个文法产生式A 都有与 之相关联的一套语义描述 属性文法(attribute grammar)是一个三元组:A=(G,V,F) 属性文法可以看作是关于语言翻译的高级规范说明,其中隐去实现细节,使用户从明确说明翻译顺序的工作中解脱出来,24,2020/9/29,中南大学

16、软件学院 陈志刚,语法制导翻译实现,从概念上讲,语法制导翻译即基于属性文法的处理过程通常是这样的:对单词符号串进行语法分析,构造语法分析树,然后根据需要遍历语法树并在语法树的各结点处按语义规则进行计算 输入符号串 分析树 属性依赖图 语义规则的计算顺序,25,2020/9/29,中南大学软件学院 陈志刚,依赖图,由称为依赖图的一个有向图 描述分析树中的继承属性和属性中间的相互依赖关系。 依赖图的构造算法: for分析树中每一个结点n do for 结点的文法符号的每一个属性a do 为a在依赖图中建立一个结点; for 分析树中每一个结点n do for结点n所用产生式对应的每一个语义规则 b

17、:=f(c1,c2,ck) do for i :=1 to k do 从ci结点到b结点构造一条有向边,26,2020/9/29,中南大学软件学院 陈志刚,依赖图-例6.2,例6.2 继承属性L.in,生 产 式,语 义 规 则,D TL,T int,T real,L L1,id,L id,L.in:=T.type,T.type=integer,T.type:=real,L1.in:=L.in,addtype(id.entry,L.in),addtype(id.entry,L.in),27,2020/9/29,中南大学软件学院 陈志刚,例6.2 Real id1,id2,id3分析树的依赖图,

18、5,6,7,8,9,10,T,4,D,L,L,L,Real,type,in,in,in,3 entry,2 entry,entry,id3,id2,id1,.,.,1,28,2020/9/29,中南大学软件学院 陈志刚,依赖图中的结点由数字来标识。从代表T.type的结点4有一条有向边连到代表L.in的结点5,因为根据产生式ETL的语义规则L1.in=L.in,可知L1.in依赖于L.in,所以有两条向下的有向边分别进入结点7和9。每一个与L产生式有关的语义规则addtype(id. Entry, L.in)都产生一个虚属性,结点 6、8和10都是为这些虚属性构造的。,29,2020/9/29

19、,中南大学软件学院 陈志刚,良定义的属性文法,很显然,一条求值规则只有在其各变元值均已求得的情况下才可以使用。但有时候可能会出现一个属性对另一个属性的循环依赖关系。从事贸易如,p、c1、c2都是属性,若有下求值规则:p: = f1(c1)、c1: = f2(c2)、c2: = f3(p)时,就无法对p求值。如果一属性文法不存在属性之间的循环依赖关系,那么称该文法为良定义的。为了设计编译程序,我们只处理良定义的属性文法。,30,2020/9/29,中南大学软件学院 陈志刚,属性的计算顺序,一个有向非循环图的拓扑序是图中结点的任何顺序m1, m2, , mk,使得边必须是从序列中前面的结点指向后面

20、的结点。也就是说,如果mimj是mi到mj的一条边,那么在序列中mi必须出现在mj之前。 一个依赖图的任何拓扑排序都给出一个分析树中结点的语义规则计算的有效顺序。这就是说,在拓扑排序中,在一个结点,语义规则b:=f(c1,c2,ck)中的属性c1,c2,ck在计算b以前都是可用的。,31,2020/9/29,中南大学软件学院 陈志刚,属性文法说明的翻译是很精确的。最基本的文法用于建立输入符号串的分析树。依赖图如上面讨论的那样建立。从依赖图的拓扑排序中,我们可以得到计算语义规则的顺序。用这个顺序来计算语义规则就得到输入符号串的翻译。 例6.2 Real id1,id2,id3分析树的依赖图 每一

21、条边都是从序号较低的结点指向序号较高的结点。历此,依赖图的一个拓扑排序可以从低序号到高序号顺序写出。从这个拓扑排序中我们可以得到下列程序,用an来代表依赖图中与序号n的结点有关的属性: a4: = real a5: = a4 addtype (id3, entry, a5); a7: = a5; addtype (id2,entry, a7) a9: = a7 addtype (id1,entry, a9) 这些语义规则的计算将把real类型填入到每个标识符对应的符号表项中。,32,2020/9/29,中南大学软件学院 陈志刚,属性计算方法,树遍历的属性计算方法 设语法树已经建立起了,并且树中

22、已带有开始符号的继承属性和终结符的综合属性。然后以某种次序遍历语法树,直至计算出所有属性。最常用的遍历方法是深度优先,从左到右的遍历方法。如果需要的话,可使用多次遍历(或称遍)。 一遍扫描的处理方法 与树遍历的属性计算文法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性的计算,而且无无需构造实际的语法树。 因为一遍扫描的处理方法与语法分析器的相互作用,它与下面两个因素密切相关: (1)所采用的语法分析方法 (2)属性的计算次序。,33,2020/9/29,中南大学软件学院 陈志刚,例:定义定点二进制数的CFG:,(1) NSS (2) SSB (3)

23、SB (4) B0 (5) B1,34,2020/9/29,中南大学软件学院 陈志刚,在某些情况下可用一遍扫描实现属性文法的语义规则计算。也就是说在语法分析的同时完成语义规则的计算,无须明显地构造语法树或构造属性之间的依赖图。因为单遍实现对于编译效率非常重要 具体的实现希望在单遍扫描中完成翻译 研究怎样实现这种翻译器。一个一般的属性文法的翻译器可能是很难建立的,然而有一大类属性文法的翻译器是很容易建立的 s-属性 适用于自底向上的计算 L-属性 适用于自顶向下的分析,也可用于自底向上。,35,2020/9/29,中南大学软件学院 陈志刚,6.3 S属性文法的自下而上计算,S属性文法,它只含有综

24、合属性。 综合属性可以在分析输入符号串的同时自下而上的分析器来计算。分析器可以保存与栈中文法符号有关的综合属性值,每当进行归约时,新的属性值就由栈中正在归约的产生式右边符号的属性值来计算。 S属性文法的翻译器通常可借助于LR分析器实现。在S属性文法的基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时对属性进行计算。,36,2020/9/29,中南大学软件学院 陈志刚,产生式 语义规则 ) (.) )1 .1. ) .l )1* .1. )F .F. )() . )ii .:. LR分析器可以改造为一个翻译器,在对输入串进行语法分析的同时对属性进行计算。 LR分析器增加语义栈,

25、37,2020/9/29,中南大学软件学院 陈志刚,*的分析和计值过程,步骤 动作 状态栈 语义栈(值栈) 符号栈 余留输入串 ) 3* ) 3 * ) * ) * ) * ) * ) * ) * ) * ) * ) * ) () * # ) () ) () )接受,38,2020/9/29,中南大学软件学院 陈志刚,BOTTOMUP 语义处理是作类型检查,对二目运算符的运算对象进行类型匹配审查。 (LR分析):增加语义栈 归约时进行语义动作. 例6.7GE: (1) E T+T (2) E T or T (3) T n (4) T b,39,2020/9/29,中南大学软件学院 陈志刚,ET

26、1 + T2 if T1.type = int and T2.type= int then E.type :=int else error E T1 or T2 if T1.type = bool and T2.type= bool then E.type :=bool else error T n T.type := int T b T.type := bool,40,2020/9/29,中南大学软件学院 陈志刚,GE: (1) E T+T (2) E T or T (3) T n (4) T b,41,2020/9/29,中南大学软件学院 陈志刚,42,2020/9/29,中南大学软件学院

27、 陈志刚,6.4 L属性文法和自顶向下翻译,一个属性文法称为L属性文法,如果对于每个产生式AX1X2Xn,其每个语义规则中的每个属性或者是综合属性,或者是Xj(1jn)的一个继承属性且这个继承属性仅依赖于: (1)产生式Xj在左边符号X1,X2,Xj-1的属性; (2)A的继承属性。 S属性文法一定是L属性文法,因为(1)、(2)限制只用于继承属性。 L属性文法允许一次遍历就计算出所有属性值。 LL(1)这种自上而下分析文法的分析过程,从概念上说可以看成是深度优先建立语法树的过程,因此,我们可以在自上而下语法分析的同时实现L属性文法的计算。,43,2020/9/29,中南大学软件学院 陈志刚,

28、例(中缀表达式翻译成相应的后缀表达式)ETRRaddop T print(addop. Lexeme) R1|Tnum print(num.val),翻译模式(Translation schemes)适合语法制导翻译的另一种描述形式。翻译模式给出了使用语义规则进行计算的次序,可把某些实现细节表示出来。在翻译模式中,和文法符号相关的属性和语义规则(这里我们也称语义动作),用花括号括起来,插入到产生式右部的合适位置上。,44,2020/9/29,中南大学软件学院 陈志刚,对于自顶向下分析,我们假设动作是在处于相同位置上的符号被展开(匹配成功)时执行的。如图中的第二个产生式中,第一个动作(对R1.i

29、赋值)是在T被完全展开成终结符号后执行的,第二个动作是在R1被完全展开成终结符号后执行的。正如前面我们所讨论的,一个符号的继承属性必须由出现在这个符号之前的动作来计算,产生式左边非终结符的综合属性必须在它所依赖的所有属性都计算出来以后才能计算。,45,2020/9/29,中南大学软件学院 陈志刚,转换左递归翻译模式的方法推广到一般,假设翻译模式1: AA1YA.a: = g(A1。a, Y.y) AX A.a: = f(X.x)每个文法符号都有一个综合属性,用相应的小写字母表示,g和f是任意函数 消除左递归,文法转换成: AXR RYR 再考虑语义动作,翻译模式变为2 AXR.i: = f(X

30、.x) R A.a: =R.s RYR1.i: = g(R.i,Y.y) R1R.s: = R1.s RR.s: = R.i,46,2020/9/29,中南大学软件学院 陈志刚,翻译模式1和翻译模式2的结果是一样的。可以给出串XY1Y2两棵带注释的语法树看出来,一棵是根据翻译模式1自下而上计算属性的。一棵是根据翻译模式2自上而下计算的。,47,2020/9/29,中南大学软件学院 陈志刚,思考问题-把建立语法树的翻译模式变换成适合预测分析的模式,EE1+T E.nptr:=mknode(+,E1.nptr,T.nptr) E E1-T E.nptr:=mknode(-,E1.nptr,T.np

31、tr) E T E.nptr:=T.nptr),48,2020/9/29,中南大学软件学院 陈志刚,6.5 自下而上计算继承属性,讨论在自下而上的分析过程中实现L属性文法的方法。这种方法可以实现任何基于LL(1)文法的L属性文法,它还可以实现许多(不是所有)基于LR(1)文法的L属性文法。这种方法是S-属性文法的自下而上翻译技术的一般化,49,2020/9/29,中南大学软件学院 陈志刚,自下而上分析器对产生式AXY的右部是通过把X和Y从分析栈中移出并用A代替它们。假设X有一个综合属性X.s,按照前面所介绍的方法我们把它与X一起放在分析栈中。 由于X.s的值在Y以下的子树中的任何归约之前已经放

32、在栈中,这个值可以被Y继承。也就是说,如果继承属性Y.i是由复写规则Y.i: = X.s定义的,则可以在需要y.i值的地方使用X.s的值。在自下而上分析中计算属性值时复写规则起非常重要的作用。看下面例子。,50,2020/9/29,中南大学软件学院 陈志刚,假设某翻译模式为: DT L.in: = T.type L TintT.type: = integer TrealT.type: = real L L1.in: = L.in L1, idaddtype(id.entry, L.in) Lidaddtype(id.entry,L.in),51,2020/9/29,中南大学软件学院 陈志刚,回

33、顾例6.2 Real id1,id2,id3分析树的依赖图,5,6,7,8,9,10,T,4,D,L,L,L,Real,type,in,in,in,3 entry,2 entry,entry,id3,id2,id1,.,.,1,52,2020/9/29,中南大学软件学院 陈志刚,例6.2输入串real Real id1,id2,id3的分析过程当L的右部被归约时,T恰好在这个右部的下面,输入 状态(符号) 使用产生式 Real id1,id2,id3# id1,id2,id3# real id1,id2,id3# T Treal ,id2,id3# Tid1 ,id2,id3# TL L id

34、 id2,id3# TL, ,id3# TL,id2 ,id3# TL L Li,d id3# TL, # TL,id3 # TL L Li,d # D D TL,53,2020/9/29,中南大学软件学院 陈志刚,用综合属性代替继承属性,有时,改变基础文法可能避免继承属性。例如,一个Pascal的说明由一标识符序列后跟类型组成,如, m, n: integer。这样的说明的文法可由下面形式的产生式构成 DL:T Tinteger|char LL, id|id 因为标识符由L产生而类型不在L的子树中,我们不能仅仅使用综合属性就把类型与标识符联系起来。事实上,如果非终结符L从第一个产生式中它的右

35、边T中继承了类型,则我们得到的属性文法就不是L属性的,因此,基于这个属性文法的翻译工作不能在语法分析的同时进行。,54,2020/9/29,中南大学软件学院 陈志刚,一个解决的方法是重新构造文法,使类型作为标识符表的最后一个元素: Did L L, id L|: T Tinteger|char 这样,类型可以通过综合属性L.type进行传递,当通过L产生每个标识符时,它的类型就可以填入到符号表中。,55,2020/9/29,中南大学软件学院 陈志刚,语义制导翻译的编译实现:,例6.6 E TE E A T E | T FT T M F T | F (E) | int A + | - M * |

36、 /,56,2020/9/29,中南大学软件学院 陈志刚,E - TE E - A T E rhs = PopOperand();lhs = PopOperand(); switch (PopOperator() case ADD: PushOperand(lhs+rhs); break; case SUB: PushOperand(lhs-rhs); break; | /* empty, do nothing */ T - FT T - M F T rhs = PopOperand();lhs = PopOperand(); switch (PopOperator() case MUL: PushOperand(lhs*rhs); break; case DIV: PushOperand(lhs/rhs); break;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论