




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上編譯原理課程設計課程報告題目 C語言詞法分析器和C-語言語法分析器 學生姓名 學生學號 指導教師 提交報告時間 2019 年 6 月 8 日C語言詞法分析器1 實驗目的及意義1. 熟悉C語言詞法2. 掌握構造DFA的過程3. 掌握利用DFA實現C語言的詞法分析器4. 理解編譯器詞法分析的工作原理2 詞法特點及正則表達式2.1詞法特點2.1.1 保留字AUTO, BREAK , CASE , CHAR , CONST , CONTINUE , DEFAULT , DO , DOUBLE , ELSE, ENUM , EXTERN , FLOAT , FOR , GOTO
2、, IF , INT , LONG , REGISTER , RETURN, SHORT , SIGNED , SIZEOF , STATIC , STRUCT , SWITCH , TYPEDEF , UNION , UNSIGNED , VOID, VOLATILE , WHILE,2.1.2 符號 + - * / + - += -= *= < <= > >= = != = ; , ( ) /* */ : 2.2 正則表達式 whitespace = (newline|blank|tab|comment)+ digit=0|.|9 nat=digit+ signed
3、Nat=(+|-)?nat NUM=signedNat(“.”nat)? letter = a|.|z|A|.|Z ID = letter(letter|digit|“_”)+ CHAR = 'other+' STRING = “other+”3 Token定義3.1 token類型保留字auto break case char const continue default do double elseenum extern float for gotoif int long redisterreturnshort signed sizeof static struct swi
4、tch typedef union unsignedvoid volatile while特殊符號+ - * / + - += -= *= < <= > >= = != = ; , ( ) /* */ :文件結束、錯誤EOF ERROR其它tokenNUM ID CHARACTER STRINGtypedef enum /錯誤、結束 ENDFILE,ERROR, /保留字 AUTO,BREAK,CASE,CHAR,CONST,CONTINUE ,DEFAULT , DO ,DOUBLE, ELSE, ENUM, EXTERN , FLOAT ,FOR , GOTO,IF
5、, INT, LONG,REGISTER , RETURN, SHORT, SIGNED ,SIZEOF ,STATIC, STRUCT ,SWITCH, TYPEDEF ,UNION, UNSIGNED , VOID,VOLATILE , WHILE, /其他token ID,NUM,CHARACTER,STRING,/特殊符號 /+、-、*、/、+、-、+=、-=、*=、<、<=、>、>=、=、!=、=、;、,、(、)、/、/*、*/、:PLUS,MINUS,TIMES,OVER,SELFPLUS,SELFMINUS,PLUSASSIGN,MINUSASSIGN,T
6、IMESASSIGN,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN, MINUSASSIGN,TIMESASSIGN,LT,LEQ,GT,GEQ,EQ,NEQ,ASSIGN,SEMI,COMMA,LPAREN, RPAREN,LBRACKET,RBRACKET, LCBRACKET,RCBRACKET,LCOMMENT,RCOMMENT,COLON TokenType;3.2 tokenType類型代碼4 DFA設計4.1 注釋的DFA設計注釋的DFA如下所示,一共分為5個狀態,在開始狀態1時,如果輸入的字符為/,則進入狀態2,此時有可能進入注釋狀
7、態,如果在狀態2時,輸入的字符為*,則進入注釋狀態,狀態將轉到3,如果在狀態3時,輸入的字符為*,則有可能結束注釋狀態,此時狀態將轉到狀態4,如果在狀態4時輸入的字符為/,則注釋狀態結束,狀態轉移到結束狀態。4.2 詞法分析的DFA設計詞法分析的DFA如下所示,一共分為10個狀態:START、INNUM、INNUM1、INNUM2、INID、INCOMPARE、INOPERATE、INSTRING、INCHAR、DONE。狀態START表示開始狀態,狀態INNUM,INNUM1,INNUM2表示數字類型(NUM)Token的狀態,狀態INID表示標示符(ID)類型Token的狀態,狀態INOP
8、ERATE表示算數運算符型Token的狀態,狀態INOCOMPARE表示比較運算符型Token的狀態,INSTRING表示字符串(STRING)類型Token的狀態,INCHAR表示字符(CHARACTER)類型Token的狀態,狀態DONE表示接收狀態。l 在開始狀態START時Ø 如果輸入的字符為空白符,如空格換行等,則仍在START狀態Ø 如果輸入的字符為digit,則進入狀態INNUM,即可能是數字類型(NUM)Token的狀態Ø 如果輸入的字符為letter,則進入狀態INID,即可能是標識符類型Token的狀態Ø 如果輸入的字符為>、&
9、lt;、!、=,則進入狀態INCOMPARE,即可能是比較運算符型Token的狀態Ø 如果輸入的字符為+、*、/,則進入狀態INOPERATE,即可能是算數運算符類型Token的狀態Ø 如果輸入的字符為,則進入狀態INCHAR,即可能是字符類型Token的狀態Ø 如果輸入的字符為“,則進入狀態INSTRING,即可能是字符串類型Token的狀態Ø 如果輸入的字符為是除以上之外的,則進入狀態DONE,這次輸入的字符可能是單目運算符、錯誤等l 在狀態INNUM時Ø 如果輸入的字符為digit,則仍停留在INNUM狀態Ø 如果輸入的字符為”
10、.”,則轉到INNUM1狀態l 在狀態INNUM1時Ø 如果輸入的字符為digit,則進入INNUM2狀態l 在狀態INNUM2時l 如果輸入的為其他的字符,則轉到DONE狀態Ø 如果輸入字符為digit,則停留在INNUM2狀態Ø 如果輸入的為其他字符,則轉到DONE狀態l 在狀態INID時Ø 如果輸入的字符為letter或“_”或digit,則仍停留在INID狀態Ø 如果輸入的為其他的字符,則轉到DONE狀態l 在狀態INCOMPARE時Ø 如果輸入的字符為=,則轉到DONE狀態Ø 如果輸入的為其他的字符,則直接轉到DO
11、NE狀態l 在狀態INOPERATE時Ø 如果輸入的字符為=,轉到DONE狀態Ø 如果輸入的為其他的字符,則直接轉到DONE狀態l 在狀態INCOMPARE時Ø 如果輸入的字符為=,則轉到DONE狀態Ø 如果輸入的為其他的字符,則直接轉到DONE狀態l 在狀態INCHAR時Ø 如果輸入為單引號,則轉到DONE狀態Ø 如果輸入的為其他字符,則停留在INCHAR狀態l 在狀態INSTRING時Ø 如果輸入為雙引號,則轉到DONE狀態Ø 如果輸入的為其他字符,則停留在INSTRING狀態l 在狀態DONE時接受狀態,根據
12、分析過程中獲取的字符串確定Token的類型,并生成和保存相應的Token5 代碼結構分析5.1主要結構詞法分析部分的代碼在scan.c和scan.h文件中,全局變量以及公共函數代碼在global.h以及util.h和util.c文件中。主函數中進行文件打開和關閉,并調用scan.c中的getToken()函數對源文件進行詞法分析。5.2 函數和成員變量的作用和含義void printToken(TokenType,const char*); /*輸出token */char* copyString(char *); /* 字符串復制 */TokenType getToken(void); /*
13、 詞法分析函數*/static int getNextChar(void) /* 獲取下一個字符 */static void ungetNextChar(void) /* 退回一個字符 */static TokenType reservedLookup (char * s) /* 查找對應的保留字*/char tokenStringMAXTOKENLEN+1; /* token字符串*/int lineno = 0; /* 當前行號 */static char lineBufBUFLEN; /* 整行代碼緩沖區 */ static int linepos = 0; /* 當前行的位置*/ st
14、atic int bufsize = 0; /* 緩沖區大小*/static int EOF_flag = FALSE; /* 文件結束標志 */6 實驗結果與分析6.1 測試文件test.c/*test.c*/int main(void)# int a = 0; float b = 20.1; char c = "abcdefg" char d = 'h' if(a>=2) b+=0.1 a+; 6.2 測試結果6.3結果分析test.c文件中包括注釋,保留字,整數和小數,標識符,特殊符號,字符串以及錯誤輸入。本程序成功對test.c文件進行了詞法分
15、析,對注釋進行了忽略,輸出了相應的行號、類型、取值,對于錯誤的輸入顯示ERROR。7 小結通過編寫C語言詞法分析器,我對編譯器的基本原理有了更深的認識,同時掌握了DFA的設計與實現。在最開始的編寫過程中,我總是把詞法和語法分析混淆,比如一些錯誤應該在語法分析中判斷,我卻寫進了詞法分析中,后來我逐步認識到詞法分析的作用就是提取源代碼中的Token。在DFA的實現過程中,我主要參考了書后tiny語言DFA的實現方法,將它擴展到C語言。另外C語言詞法比較復雜,因為時間關系我省略了一些,比如位運算符,轉義字符等等,希望今后能完善。C-語言語法分析器1 實驗目的及意義用C語言編制Tiny/C-語言的語法
16、分析程序,實現對詞法分析程序所提供的Token序列的語法檢查和結構分析。 2 文法規則(EBNF)programdeclaration-listdeclaration_list declaration declaration declarationvar-declaration|fun-declarationvar_declaration type-specifier ID; | type-specifier ID NUM;type - specifier int | voidfun-declatationtype-specifier ID (params) | compound-stmtpa
17、ramsparam_list | voidparam_listparam, paramparam type-specifier ID compound-stmt local-declaration statement-listlocal-declarations empty var- declarationstatement-liststatementstatementexpression-stmt | compound-stmt | selection-stmt | iteration-stmt | return-stmtexpression-stmt expression;selectio
18、n-stmtif (expression) statement else statementiteration-stmtwhile (expression)statementreturn-stmtreturn expression;expression var = expression | simple-expressionrelop < = | < | > | > = | = = | ! =varID | ID expressionsimple-expression>additive-expression relop additive-expression ad
19、ditive-expressiontermaddop term addop + | -termfactormulop factor mulop * | /factor(expression) | var | call | NUMcallID( args )argsarg-list | emptyarg-list expression, expression3 節點類型及定義3.1節點類型節點類型描述子節點IntKInt型變量或返回值無VoidKvoid型變量或返回值無IdK標示符id無ConstK數值無Var_DeclK變量聲明變量類型+變量名Var_DeclK數組聲明數組名+數組大小FunK
20、函數聲明返回類型+函數名+參數列表+函數體ParamsKFunK的參數列表參數(如果有多個參數,則之間為兄弟節點)ParamKFunK的參數參數類型+參數名CompK復合語句體變量聲明列表+語句列表Selection_StmtKif條件表達式+IF體+ELSE體Iteration_StmtKwhile條件表達式+循環體Return_StmtKreturn表達式AssignK賦值被賦值變量+賦值變量OpK運算運算符左值+運算符右值Arry_ElemK數組元素數組名+下標CallK函數調用函數名+參數列表ArgsKCallK的參數列表表達式UnkownK未知節點無3.2節點定義typedef st
21、ruct treeNodestruct treeNode * child4;struct treeNode * sibling;int lineno;NodeKind nodekind;union TokenType op; int val; const char * name; attr; ExpType type; TreeNode;4 代碼結構分析文法programdeclaration-list分析函數TreeNode * parse(void)說明C-程序由一個聲明序列組成,parse(void)函數首先執行getToken()然后直接調用declaration_list()返回樹節
22、點代碼TreeNode * parse(void)TreeNode * t;token = getToken();t = declaration_list();if(token!=ENDFILE) syntaxError("endfile error");return t;文法declaration_list declaration declaration 分析函數TreeNode * declaration_list(void)說明聲明序列是由若干聲明構成,declaration_list(void)函數中直接調用declaration()函數返回樹節點,當前token為
23、INT或VOID時,調用declaration()返回之前樹節點的兄弟節點。代碼TreeNode * declaration_list(void)TreeNode * t = declaration();TreeNode * p =t;/程序以變量聲明開始 while(token!=INT)&&(token!=VOID)&&(token!=ENDFILE) syntaxError("開始不是類型聲明"); token = getToken(); if(token=ENDFILE) break; while(token=INT|token=VO
24、ID)TreeNode * q;q = declaration();if (q!=NULL)if (t=NULL)t=p=q;elsep->sibling=q;p=q;match(ENDFILE);return t;文法declarationvar-declaration|fun-declarationvar_declaration type-specifier ID; | type-specifier ID NUM;fun-declatationtype-specifier ID (params) | compound-stmt type-specifier int | void分析函
25、數 TreeNode * declaration(void)說明首先判斷類型,執行match函數, 匹配類型和ID,向前探測1個token的值確定是函數聲明還是變量聲明,如果token為,則是數組變量聲明,返回節點Array_DeclK, token為(,則是函數聲明,返回節點FunK, token為;則是普通變量聲明,返回節點Var_DeclK代碼TreeNode * declaration(void)TreeNode * t = NULL;TreeNode * p = NULL;TreeNode * q = NULL;TreeNode * s = NULL;TreeNode * a = N
26、ULL;if (token=INT)p=newNode(IntK);match(INT);else if (token=VOID)p=newNode(VoidK);match(VOID);else syntaxError("type error");if(p!=NULL&&token=ID)q = newNode(IdK);q-> = copyString(tokenString); match(ID);if (token=LPAREN)t = newNode(FunK);t->child0 = p; /p是t子節點t->
27、child1 = q;match(LPAREN);t->child2 = params();match(RPAREN);t->child3 = compound_stmt();else if (token=LBRACKET)t = newNode(Var_DeclK);a = newNode(Arry_DeclK);t->child0 = p; /p是t子節點t->child1 = a;match(LBRACKET);s = newNode(ConstK);s->attr.val = atoi(tokenString);match(NUM);a->child
28、0=q;a->child1=s;match(RBRACKET);match(SEMI);else if (token=SEMI)t = newNode(Var_DeclK);t->child0 = p;t->child1 = q;match(SEMI);elsesyntaxError("");elsesyntaxError("");return t;文法paramsparam_list | void分析函數TreeNode * params(void)說明參數列表,根節點ParamsK,首先判斷token是否是VOID,如果是VOID則
29、匹配,判斷下一個token,如果是右括號,則參數列表中只有子節點VoidK,如果是ID,則子節點是param_list,如果開始時token是INT,則參數列表子節點是param_list代碼TreeNode * params(void)TreeNode * t = newNode(ParamsK);TreeNode * p = NULL;if (token=VOID)p = newNode(VoidK);match(VOID);if (token=RPAREN)if(t!=NULL)t->child0 = p;else/參數列表為(void id,) t->child0 = pa
30、ram_list(p);else if (token=INT)t->child0 = param_list(p);else syntaxError("");return t;文法param_listparam, param分析函數TreeNode * param_list(TreeNode * k)說明說明參數列表由param序列組成,并由逗號隔開。param_list(TreeNode * k)函數使用遞歸向下分析方法直接調用param(TreeNode * k)函數,并返回樹節點代碼TreeNode * param_list(TreeNode * k)TreeNo
31、de * t = param(k);TreeNode * p = t; k = NULL;/沒有要傳給param的VoidK,所以將k設為NULLwhile (token=COMMA)TreeNode * q = NULL;match(COMMA);q = param(k);if (q!=NULL)if (t=NULL)t=p=q;elsep->sibling = q;p = q;return t;文法param type-specifier ID 分析函數TreeNode * param(TreeNode * k)說明探測token是INT還是VOID,決定子節點類型是IntK還是Vo
32、idK,IdK作為第二個子節點,向前探測一個token,如果是左中括號,則產生第三個子節點代碼TreeNode * param(TreeNode * k)TreeNode * t = newNode(ParamK);TreeNode * p = NULL;TreeNode * q = NULL;if(k=NULL&&token=VOID)p = newNode(VoidK);match(VOID);else if(k=NULL&&token=INT)p = newNode(IntK);match(INT);else if (k!=NULL)p = k;if(p!
33、=NULL)t->child0 = p;if (token=ID)q = newNode(IdK);q-> = copyString(tokenString);t->child1 = q;match(ID);elsesyntaxError("");if (token=LBRACKET&&(t->child1!=NULL)/match(LBRACKET);t->child2 = newNode(IdK);match(RBRACKET);else return t; else syntaxError("&
34、quot;);return t;文法compound-stmt local-declaration statement-list分析函數TreeNode * compound_stmt(void)說明復合語句,直接調用local_declaration()函數和statement_list()函數,產生兩個子節點代碼TreeNode * compound_stmt(void) TreeNode * t = newNode(CompK);match(LCBRACKET);t->child0 = local_declaration();t->child1 = statement_lis
35、t(); match(RCBRACKET);return t;文法local-declarations empty var- declaration分析函數TreeNode * local_declaration(void)說明全局變量聲明,可以是空,也可以是若干變量聲明,首先判斷token是否等于INT或VOID,從而得知是否為空,若不為空則創建一個Var_DeclK節點代碼TreeNode * local_declaration(void) TreeNode * t = NULL;TreeNode * q = NULL;TreeNode * p = NULL;while(token=INT
36、 | token=VOID) p = newNode(Var_DeclK);if(token=INT)TreeNode * q1 = newNode(IntK);p->child0 = q1;match(INT);else if(token=VOID)TreeNode * q1 = newNode(VoidK);p->child0 = q1;match(INT);if(p!=NULL)&&(token=ID) TreeNode * q2 = newNode(IdK); q2-> = copyString(tokenString);p->
37、child1 = q2;match(ID);if(token=LBRACKET) TreeNode * q3 = newNode(Var_DeclK);p->child3 = q3;match(LBRACKET);match(RBRACKET);match(SEMI);else if(token=SEMI)match(SEMI);elsematch(SEMI); else syntaxError("");if(p!=NULL)if(t=NULL)t = q = p;elseq->sibling = p;q = p;return t;文法statement-lis
38、tstatement分析函數TreeNode * statement_list(void)說明調用statement()創建根節點,向前探測一個token,創建兄弟節點代碼TreeNode * statement_list(void) TreeNode * t = statement(); TreeNode * p = t;while (IF=token | LCBRACKET=token | ID=token | WHILE=token | RETURN =token | SEMI=token | LPAREN=token | NUM=token) TreeNode * q;q = stat
39、ement();if(q!=NULL)if(t=NULL) t = p = q;else p->sibling = q;p = q;return t;文法statementexpression-stmt| compound-stmt | selection-stmt | iteration-stmt | return-stmt分析函數TreeNode * statement(void)說明statement由表達式或復合語句或if語句或while語句或return語句構成。statement(void)函數通過判斷先行Token類型確定到底是哪一種類型。如果是IF則調用selection
40、_statement(),如果是WHILE,則調用iteration_stmt(),如果是RETURN,則調用return(),如果是左大括號,則是復合語句類型,如果是ID、SEMI、LPAREN、NUM,則是表達式語句類型代碼TreeNode * statement(void) TreeNode * t = NULL;switch(token)case IF:t = selection_stmt(); break;case WHILE:t = iteration_stmt(); break;case RETURN:t = return_stmt(); break;case LCBRACKET
41、:t = compound_stmt(); break;case ID: case SEMI: case LPAREN: case NUM: t = expression_stmt(); break;default:syntaxError("");token = getToken();break;return t;文法expression-stmt expression;分析函數TreeNode * expression_stmt(void)說明說明表達式語句有一個可選的且后面跟著分號的表達式。expression_stmt(void)函數通過判斷先行token類型是否為分
42、號,如果不是則直接調用函數expression()代碼TreeNode * expression_stmt(void) TreeNode * t = NULL;if(token=SEMI) match(SEMI);return t;else t = expression();match(SEMI);return t;文法expression var = expression | simple-expression分析函數TreeNode * expression(void)說明expression(void)函數通過判斷先行Token類型是否為ID,如果不是說明只能是simple_expres
43、sion情況,則調用simple_expression(TreeNode * k)函數遞歸向下分析;如果是ID說明可能是賦值語句,或simple_expression中的var和call類型的情況,所以再求其Follow集合,如果集合求出來是賦值類型的Token,則說明是賦值語句,于是新建一個AssignK節點就行;如果集合求出來不是賦值類型的Token則說明是simple_expression中的var和call類型的情況,然后再調用simple_expression(TreeNode * k)函數遞歸向下分析,并將已經取出IdK節點傳遞給simple_expression(TreeNode
44、 * k)函數代碼TreeNode * expression(void) TreeNode * t = var();if(t=NULL)/不是以ID開頭,只能是simple_expression情況 t = simple_expression(t); else/以ID開頭,可能是賦值語句,或simple_expression中的var和call類型的情況 TreeNode * p = NULL;if(token=ASSIGN)/賦值語句 p = newNode(AssignK);/p-> = ;match(ASSIGN);p->child0 = t;p->c
45、hild1 = expression();return p;else /simple_expression中的var和call類型的情況 t = simple_expression(t); return t;文法varID | ID expression分析函數TreeNode * var(void)說明創建IdK節點,判斷先行token類型是否是中括號,如果是就創建Arry_ElemK節點,調用expression()得到子節點代碼TreeNode * var(void) TreeNode * t = NULL;TreeNode * p = NULL;TreeNode * q = NULL;
46、if(token=ID)p = newNode(IdK);p-> = copyString(tokenString); match(ID);if(token=LBRACKET) match(LBRACKET);q = expression();match(RBRACKET);t = newNode(Arry_ElemK);t->child0 = p;t->child1 = q;elset = p;return t;文法simple-expression>additive-expression relop additive-expression relo
47、p < = | < | > | > = | = = | ! =分析函數TreeNode * simple_expression(TreeNode * k)說明simple_expression(TreeNode * k)函數先調用additive_expression(TreeNode * k)函數返回一個節點,然后再一直判斷后面的Token是否為<=、<、>、>=、=、!=,如果是則新建OpK節點,然后令之前的節點為其第一個子節點,然后繼續調用additive_expression(TreeNode * k)函數返回一個節點,作為OpK節點的第
48、二個節點代碼TreeNode * simple_expression(TreeNode * k) TreeNode * t = additive_expression(k);k = NULL;if(EQ=token | GT=token | GEQ=token | LT=token | LEQ=token | NEQ=token) TreeNode * q = newNode(OpK);q->attr.op = token; q->child0 = t;t = q;match(token);t->child1 = additive_expression(k); return
49、t;return t;5 實驗結果與分析測試文本test.cint a10;int min(int a,int low,void a)int k; int x; int i;k=low;while(i<low)a0=1;if(k>0)x=1;return x;測試結果成功實現語法分析6 小結通過這次實驗,我加深了對語法分析的認識,掌握了遞歸向下分析方法,實現了對詞法分析程序所提供的Token序列的語法檢查和結構分析。 語法分析程序編寫相對于詞法分析要困難得多,首先要將BNF化為EBNF,運用遞歸向下的方法進行編寫,構造出語法樹,判別語法分析過程中是否出錯以及出錯位置和錯誤類型。雖然EBNF轉換成代碼的過程原理比較簡單,但是操作起來比較繁瑣。一開始我對TreeNode數據結構也不是很理解,通過閱讀書后的tiny語言語法分析源代碼,我弄懂了語法樹的輸出。附錄(源代碼)Main.c#include "global.h"#include "util.h"#include "scan.h"/* 全局變量 */int lineno = 0;/* 編譯過程標志 */int EchoSource = TRUE;int TraceSca
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 特殊藥品入境管理制度
- 豬場材料入庫管理制度
- 環保違規舉報管理制度
- 環衛企業規章管理制度
- 環境消毒滅菌管理制度
- 2024-2025學年高中化學第2章官能團與有機化學反應烴的衍生物第4節第2課時酯學案魯科版選修5
- 班級學生違紀管理制度
- 班組經費使用管理制度
- 2025年中國郵政集團有限公司遼寧省分公司校園招聘筆試模擬試題及參考答案詳解1套
- 生產外包屬于管理制度
- 2025年廬山市國有投資控股集團有限公司招聘筆試沖刺題(帶答案解析)
- 生物基可降解地膜行業深度調研及發展項目商業計劃書
- 出租車租憑合同協議書
- GB/T 24217-2025洗油
- 2025年天津市西青區八年級會考模擬生物試卷(含答案)
- 寧波輔警考試題庫2024
- 2025年中考地理真題試題(含解析)
- 2025年社區工作者考試試題及答案
- 軟件知識產權授權管理框架與合規性研究
- ISO9001質量管理體系培訓考試試題含答案
- 2025-2030中國雷達告警接收機行業市場發展趨勢與前景展望戰略研究報告
評論
0/150
提交評論