广东工业大学pl0课程设计.doc

上传人:夜** 文档编号:85375661 上传时间:2023-04-10 格式:DOC 页数:24 大小:378.50KB
返回 下载 相关 举报
广东工业大学pl0课程设计.doc_第1页
第1页 / 共24页
广东工业大学pl0课程设计.doc_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《广东工业大学pl0课程设计.doc》由会员分享,可在线阅读,更多相关《广东工业大学pl0课程设计.doc(24页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、课 程 设 计课程名称 编译原理 题目名称编译原理课程设计_学生学院 计算机学院 专业班级_ 08 级计科 3 班_学号3208006558 学生姓名 刘恰恰 指导教师张巍 2022年 1月 6日一、设计要求根本内容(1) 扩大赋值运算:+= 和 -=(2) 扩大语句Pascal 的FOR 语句:FOR := TO DO FOR := DOWNTO DO 其中,语句的循环变量的步长为 2,语句的循环变量的步长为-2。选做内容(1) 增加运算:+ 和 -。(2) 增加类型: 字符类型; 实数类型。(3) 扩大函数: 有返回值和返回语句; 有参数函数。(4) 增加一维数组类型可增加指令。(5) 其

2、他典型语言设施。二、概述:源、目标语言,实现工具平台,运行平台1. 源语言:PL/0 语言2. 目标语言:类PCODE3. 实现工具:C+Builder4. 运行平台:windows xp三、构造设计说明:各功能模块描述1、 void Error(int n) :错误处理,打印出错位置和错误编码2、 void GetCh:漏掉空格,读取一个字符3、 void GetSym:词法分析,读取一个单词4、 void GEN(FCT X, int Y, int Z):生成目标代码,并送入目标程序区5、 void TEST(SYMSET S1, SYMSET S2, int N):测试当前单词符号是否合

3、法6、 void ENTER(OBJECTS K, int LEV, int &TX, int &DX):登录名字表7、 int POSITION(ALFA ID, int TX):查找标识符在名字表中的位置8、void ConstDeclaration(int LEV,int &TX,int &DX):常量说明处理9、 void VarDeclaration(int LEV,int &TX,int &DX:)变量说明处理10、void CharDeclaration(int LEV,int &TX,int &DX):字符说明处理11、void RealDeclaration(int LEV,

4、int &TX,int &DX):实数说明处理12、void ListCode(int CX0):列出目标代码清单13、void FACTOR(SYMSET FSYS, int LEV, int &TX) :因子处理14、void TERM(SYMSET FSYS, int LEV, int &TX) :项处理15、void EXPRESSION(SYMSET FSYS, int LEV, int &TX):表达式处理16、void CONDITION(SYMSET FSYS,int LEV,int &TX) :条件处理17、void STATEMENT(SYMSET FSYS,int LEV

5、,int &TX):语句局部处理18、void Block(int LEV, int TX, SYMSET FSYS) :分程序分析处理过程19、int BASE(int L,int B,int S):通过静态链求出数据区的基地址20、void Interpret :对目标代码的解释执行程序21、voidfastcall TForm1:ButtonRunClick(TObject *Sender):进展编译,RUN四、主要成分描述1、符号表struct ALFA NAME;OBJECTS KIND;union int VAL;/*CONSTANT*/struct int LEVEL,ADR,S

6、IZE; vp;/*VARIABLE,PROCEDUR:*/; TABLETXMAX;在编译程序中符号表用来存放语言程序中消灭的有关标识符的属性信息,这些信息集中反映了标识符的语义特征属性.符号表的主要功能如下:1、收集符号属性2、上下文语义合法性检查的依据3、作为目标代码生成阶段地址安排的依据.2、运行时存储组织和治理当源程序经过语法分析,假设未觉察错误时,由编译程序调用解释程序,对存放在 CODE 中的代码CODE0开头进展解释执行.当废弃完毕后,记录源程序中标识符的TABLE 表已没有作用.因此存储区只需以数组CODE 存储的只读目标程序和运行机制时的数据区S,S 是由解释程序定义的一维

7、整数型数组. 解释执行时的数据空间S 为栈式计算机的在座空间,遵循后进先出规章,对每个过程(包括主程序)当调用 时,才安排数据空间,退出过程进, 则所安排原则的数据空间被释放.解释程序还定义了 4 个存放器:1、指令存放器.存放当前正在解释的一条目标指令 2、程序地址存放器.指向下一条要执行的目标程序的地址3、栈顶存放器.4、基址存放器.指向每个过程被调用时,在数据区S 中给它安排原则的数据段起始地址,也称基地址.3、语法分析方法语法分析的任务是识别由词法分析给出的单词符号序列在构造上是否符合给定的文法 规章.PL/0 编译程序的语法分析承受了自顶向下的递归子程序法.粗略地说:就是对应每个非终

8、结符语法单元,编一个独立的处理过程(或子程序).语法分析争辩从读入第一个单词开始由非终结符程序即开头符动身,沿语法描述图箭头所指出的方向进展分析.当遇到非终结符时,则调用相应的处理过程,从语法描述图看也就进入了一个语法单元,再沿当前所进入的语法描述图的箭头方向进展分析,当遇到描述图中是终结符时,则推断当前读入的单词是否 与图中的终结符相匹配,假设匹配,则执行相应的语义程序(就是翻译程序).再读取下一个单词连续分析.遇到分支点时将当前的单词与分支点上的多个终结符逐个相比较,假设都不匹配时可能是进入下一非终结符语法单位或是出错.假设一个 PL/0 语言程序的单词序列在整修语法分析中,都能逐个得到匹

9、配,直到程序完毕.,这时就说所输入的程序是正确的.对于正确的语法分析做相应的语义翻译,最终得出目标程序.4、中间代码表示中间代码表示格式如下:f L a其中 f 代表功能码,l 表示层次差,也就是变量或过程被引用的分程序与说明该变量或过程的分程序之间的层次差.a 的含意对不同的指令有所区分,见下面对每条指令解释说明.1.LIT0A将常数值取到栈顶,A 为常数值2.LODLA将变量值取到栈顶,A 为偏移量,L 为层差3.STOLA将栈顶内容送入某一变量单元中,A 为偏移量,L 为层差4.CALLA调用过程,A 为过程地址,L 为层差5.INT0A在运行栈中为被调用的过程开拓A 个单元的数据区6.

10、JMP0A无条件跳转到A 地址7.JPC0A条件跳转,当栈顶布尔值非真则跳转到A 地址,否则挨次执行8.OPR00过程调用完毕后,返回调用点并退栈9.OPR01栈顶元素取反10.OPR02次栈顶与栈顶相加,退两个栈元素,结果值进栈11.OPR03次栈顶减去栈顶,退两个栈元素,结果值进栈12.OPR04次栈顶乘以栈顶,退两个栈元素,结果值进栈13.OPR05次栈顶除以栈顶,退两个栈元素,结果值进栈14.OPR06栈顶元素的奇偶推断,结果值在栈顶15.OPR0716.OPR08次栈顶与栈顶是否相等,退两上栈元素,结果值进栈17.OPR09次栈顶与栈顶是否不等,退两个栈元素,结果值进栈18.OPR0

11、10次栈顶是否小于栈顶,退两个栈元素,结果值进栈19.OPR011次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈20.OPR012次栈顶是否大于栈顶,退两个栈元素,结果值进栈21.OPR013次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈22.OPR014栈顶值输出到屏幕23.OPR015屏幕输出换行24.OPR016从命令行读入一个输入置于栈顶五、测试用例1、测试文件名:E0101.plo测试对象:+= 、-=、+、- 测试结果:2、测试文件名:E0102.plo测试对象:for,char 和 real测试结果:3、测试文件名:E0103.plo 测试对象:一维数组 测试结果:六、开发过

12、程和完成状况1) 开发过程在课内试验根底上连续操作:1 扩大赋值运算:+= 和 -=,增加运算:+ 和 -。首先增加保存字PLUSBK+=、MINUSBK-=、INC+、DEC(-)到相应的位置、并增加相应的代码,用于词法分析的识别。具体扩大到 typedef enum 和 char *SYMOUT 和 GetSym 函数中。具体添加的代码如下: void GetSym /词法分析,猎取一个符号/以下是增加+=,-=,+,- 局部elseif(CH=”+”)GetCh; if(CH=”=”)SYM=PLUSBK;GetCh;else if(CH=”+”)SYM=INC;GetCh;else S

13、YM=PLUS;elseif(CH=”-”)GetCh;if(CH=”=”)SYM=MINUSBK;GetCh;else if(CH=”-”)SYM=DEC;GetCh; else SYM=MINUS; /*GetSym*/ void FACTOR(SYMSET FSYS, int LEV, int &TX) /因子处理int i,j;TEST(FACBEGSYS,FSYS,24); while (SymIn(SYM,FACBEGSYS) if (SYM=IDENT)if(SYM=INC)GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0

14、,1);GEN(OPR,0,2);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym;if(SYM=DEC)GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,3);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym;elseif(SYM=INC)GetSym; i=POSITION(ID,TX);if (i=0) Error(11); elseif (TABLEi.KIND!=VARIABLE)Error(12);

15、i=0;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,2);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym;elseif(SYM=DEC)GetSym; i=POSITION(ID,TX);if (i=0) Error(11); elseif (TABLEi.KIND!=VARIABLE)Error(12); i=0;GEN(LOD,LEV-TABLEi.vp.LEVE

16、L,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,3);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym;TEST(FSYS,FACBEGSYS,23);/*FACTOR*/ void STATEMENT(SYMSET FSYS,int LEV,int &TX) /语句处理inti,j,j1,j2,CX1,CX2,STE,STE1,tag=0;switch (SYM) case IDENT:if (TABLEi.KIND=VA

17、RIABLE)GetSym;if (SYM=BECOMES)else if(SYM=PLUSBK)GetSym;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); EXPRESSION(FSYS,LEV,TX);GEN(OPR,0,2);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);else if(SYM=MINUSBK)GetSym;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); EXPRESSION(FSYS,LEV,TX);GEN(OPR,0,3);GEN(STO,LEV-

18、TABLEi.vp.LEVEL,TABLEi.vp.ADR);else if(SYM=INC)GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,2);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); TABLEi.VAL=NUM;GetSym;else if(SYM=DEC)GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,3);GEN(STO,LEV-TABLEi.vp.LEVEL,TAB

19、LEi.vp.ADR);TABLEi.VAL=NUM;GetSym;else Error(13); break;case INC:/+GetSym; i=POSITION(ID,TX);if (i=0) Error(11); elseif (TABLEi.KIND!=VARIABLE)/*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,2);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR)

20、; TABLEi.VAL=NUM;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym; break;case DEC:GetSym;/-i=POSITION(ID,TX);if (i=0) Error(11); elseif (TABLEi.KIND!=VARIABLE)/*ASSIGNMENT TO NON-VARIABLE*/Error(12); i=0;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1);GEN(OPR,0,3);GEN(STO,LEV-TABLEi.vp.LEV

21、EL,TABLEi.vp.ADR); TABLEi.VAL=NUM;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);GetSym; break; /*STATEMENT*/+和-可以增加到运算表达式中对单个数值进展运算或直接跟在数值变量标识符,而+=和-=只能跟在变量标识符的后面。2扩大语句Pascal 的 FOR 语句:FOR := TO DO FOR := DOWNTO DO 其中,语句的循环变量的步长为 2,语句的循环变量的步长为-2。void STATEMENT(SYMSET FSYS,int LEV,int &TX) /语句处理switch (S

22、YM) case FORSYM:/for 语句处理GetSym; if(SYM!=IDENT)Error(8); i=POSITION(ID,TX);if (i=0) Error(11); elseif (TABLEi.KIND!=VARIABLE) Error(12); i=0;GetSym;if (SYM=BECOMES)GetSym; EXPRESSION(SymSetUnion(SymSetNew(TOSYM,DOSYM,DOWNTOSYM),FSYS),LEV,TX);if (i!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); TABL

23、Ei.VAL=NUM;else Error(13); if(SYM=TOSYM)GetSym; EXPRESSION(SymSetUnion(SymSetNew(TOSYM,DOSYM),FSYS),LEV,TX); if(SYM=DOSYM)GetSym;else Error(18);CX1=CX;GEN(OPR,0,17);GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(OPR,0,11);CX2=CX;GEN(JPC,0,0);STATEMENT(FSYS,LEV,TX);GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi

24、.vp.ADR); GEN(LIT,0,2);GEN(OPR,0,2);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); TABLEi.VAL=TABLEi.VAL+1;GEN(JMP,0,CX1); CODECX2.A=CX;if(SYM=DOWNTOSYM)GetSym; EXPRESSION(SymSetUnion(SymSetNew(DOWNTOSYM,DOSYM),FSYS),LEV,TX); if(SYM=DOSYM)GetSym;else Error(18);CX1=CX;GEN(OPR,0,17);GEN(LOD,LEV-TABLEi.vp

25、.LEVEL,TABLEi.vp.ADR); GEN(OPR,0,13);CX2=CX;GEN(JPC,0,0);STATEMENT(FSYS,LEV,TX);GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,2);GEN(OPR,0,3);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); TABLEi.VAL=NUM;GEN(JMP,0,CX1); CODECX2.A=CX;break;TEST(FSYS,SymSetNULL,19); /*STATEMENT*/(2) 增加类型: 字符类型; 实

26、数类型首先词法分析中参加小数和字符的识别;然后在符号表中参加类型属性项;第三步在定义常量、变量、参变量、数组、函数的过程中,参加类型的声明过程。REALCON表示实型, CHARCON表示字符型;第四步,在运算过程中对每个运算操作进展类型匹配的检查。字符型不允许参加到运算表达式中,整型类型的赋值运算和数组上下界的运算中不行以消灭/法运算;最终在解释执行过程中将虚拟的数据堆栈类型调整为实型,这样就无须在其他代码局部扩大。 void GetSym /词法分析,猎取一个符号elseif (CH=”0” & CH=”0” & CH=”0” & CHNMAX) Error(30);elseif(int)

27、CH=39)/参加字符类型 GetCh;if(CH=”A” & CH=”a” & CH=”z”)NUM=(int)CH;GetCh;if(int)CH=39)SYM=CHARS;else NUM=0;SYM=NUL;Error(39);/类型错误else Error(39); /类型不匹配GetCh; /*GetSym*/void ENTER(OBJECTS K, int LEV, int &TX, int &DX) /*在名字表中参加一项*/case CHARCON:/*字符*/ TABLETX.vp.LEVEL=LEV; TABLETX.vp.ADR=DX; DX+;break;case

28、REALCON:/*实数*/ TABLETX.vp.LEVEL=LEV; TABLETX.vp.ADR=DX; DX+;break; /*ENTER*/ /-void CharDeclaration(int LEV,int &TX,int &DX) /声明if (SYM=IDENT) ENTER(CHARCON,LEV,TX,DX); GetSym; else Error(4); /*CharDeclaration*/-void RealDeclaration(int LEV,int &TX,int &DX) /声明if (SYM=IDENT) ENTER(REALCON,LEV,TX,DX)

29、; GetSym; else Error(4); /*RealDeclaration*/void FACTOR(SYMSET FSYS, int LEV, int &TX) /因子处理switch (TABLEi.KIND) case CHARCON:GetSym;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);break; case REALCON:GetSym;GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);break;/*FACTOR*/void STATEMENT(SYMSET FSYS,int LEV,int

30、 &TX) /语句处理inti,j,j1,j2,CX1,CX2,STE,STE1,tag=0;switch (SYM) /赋值语句处理case IDENT:i=POSITION(ID,TX);if (i=0) Error(11);if (TABLEi.KIND=CHARCON)GetSym;if(SYM!=BECOMES)Error(13);else GetSym; if(SYM!=CHARS) Error(32);elseGEN(LIT,0,NUM);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym;break;if (TABLEi.KIN

31、D=REALCON)GetSym;if(SYM!=BECOMES)Error(13);else GetSym;GEN(LIT,0,NUM);GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GetSym;break;case READSYM:/read语句处理if(TABLEj.KIND=CHARCON)GEN(OPR,0,21);GEN(STO,LEV-TABLEj.vp.LEVEL,TABLEj.vp.ADR); if(TABLEj.KIND=REALCON)GEN(OPR,0,20);GEN(STO,LEV-TABLEj.vp.LEVEL,TABLE

32、j.vp.ADR);break; /* READSYM */case WRITESYM:/依据write语句处理,与read类似 if(TABLEii.KIND=CHARCON) EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);GEN(OPR,0,19); if(TABLEii.KIND=REALCON)EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX); GEN(OPR,0,14);break; /*WRITESYM*/ /*STATEMENT*/v

33、oid Block(int LEV, int TX, SYMSET FSYS) /编译程序主体if (SYM=CHARSYM) /处理声明GetSym;do CharDeclaration(LEV,TX,DX);while (SYM=COMMA) GetSym; CharDeclaration(LEV,TX,DX); if (SYM=SEMICOLON) GetSym;else Error(5);while(SYM=IDENT);if (SYM=REALSYM) /处理声明GetSym;do RealDeclaration(LEV,TX,DX);while (SYM=COMMA) GetSym

34、; RealDeclaration(LEV,TX,DX); if (SYM=SEMICOLON) GetSym;else Error(5);while(SYM=IDENT); /*Block*/*虚拟机代码及其构造*/ typedefenum LIT, OPR, LOD, STO, CAL, INI, JMP, JPC FCT;typedef struct FCT F;/*FUNCTION CODE*/int L;/*0.LEVMAXLEVEL*/float A;/*0.AMAXDISPLACEMENT ADDR*/ INSTRUCTION;(3) 扩大函数: 有返回值和返回语句; 有参数函数

35、。未进展扩大(4) 增加一维数组类型。首先增加保存字LSQUARE,RSQUARE,MIDD到相应的位置,具体扩大到 typedef enum 和char *SYMOUT中,用以对数组变量的声明;然后在变量类型处理过程中参加数组类型声明局部,并且同时为该数组开出实际的储存空间;数组变量的引用的地方和变量的引用引用的地方一样,即在运算表达式过程中或赋值语句中;另外在FACKTO中也要加处数组的识别,用于因子遇到数组的状况,STATEMENT中READ同样处理。语法分析图如下:数据类型标识符上界下界;,void VarDeclaration(int LEV,int &TX,int &DX) / 变

36、量声明处理int num1,k,m;if (SYM=IDENT) ENTER(VARIABLE,LEV,TX,DX); GetSym; else Error(4);if(SYM=LSQUARE)/标识符为”,数组变量说明处理GetSym; if(SYM=NUMBER)num1=NUM;/下界为数字GetSym;if(SYM=MIDD)/下界的下一个标识符为” GetSym;else Error(2);/出错if(SYM=NUMBER)/上界为数字,计算数组的长度并留出空间DX=DX+NUM-num1+1;/ 移动指针GetSym;else/上界为标识符 m=POSITION(ID,TX); /

37、查找标识符的位置if(m=0) Error(11);elseif(TABLEm.KIND=CONSTANT)/标识符为常量k=TABLEm.VAL;else Error(41);m=0;DX=DX+k-num1+1;/ 计算数组的长度并留出空间,移动指针GetSym;else/下界为标识符m=POSITION(ID,TX);/查找标识符的位置if(m=0) Error(11);elseif(TABLEm.KIND=CONSTANT) /为常量num1=TABLEm.VAL;/把其值赋给num1 elseError(41);m=0;GetSym;if(SYM=MIDD) /假设下界的下一个标识符

38、为”,则再取下一个GetSym;if(SYM=NUMBER)/上界为数字DX=DX+NUM-num1+1;GetSym;else/上界为标识符m=POSITION(ID,TX); /查找标识符的位置if(m=0) Error(11);elseif(TABLEm.KIND=CONSTANT) /常量k=TABLEm.VAL;/值赋kelseError(41);m=0;/出错DX=DX+k-num1+1;GetSym;if(SYM=RSQUARE)/标识符为数组的符号”,则取下一个单词GetSym;else Error(61);/漏掉括号”/*VarDeclaration*/ void FACTO

39、R(SYMSET FSYS, int LEV, int &TX) /因子处理int i,j,tag=0;/tag 为数组的标志,0 为不存在,1 为存在TEST(FACBEGSYS,FSYS,24);while (SymIn(SYM,FACBEGSYS) if (SYM=IDENT) i=POSITION(ID,TX);if (i=0) Error(11); elseswitch (TABLEi.KIND) case CONSTANT: GetSym;GEN(LIT,0,TABLEi.VAL); break;case VARIABLE: GetSym;if(SYM=LSQUARE)/”GetSym; if(SYM=NUMBER)FTE=NUM;GetSym;else if(SYM=IDENT)/把数组的下标赋给j 和 FTEj=POSITION(ID,TX); FTE=TABLEj.VAL;GetSym;elseError(60); if(SYM=RSQUARE)GetSym; ta

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com