freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c語(yǔ)言詞法分析器和c-語(yǔ)言語(yǔ)法分析器編譯原理課程設(shè)計(jì)-在線瀏覽

2025-05-06 16:34本頁(yè)面
  

【正文】 struct treeNode * child[4]。 int lineno。 union { TokenType op。 const char * name。 ExpType type。 4 代碼結(jié)構(gòu)分析 文法 program→declarationlist 分析函數(shù) TreeNode * parse(void) 說(shuō)明 C程序由一個(gè)聲明序列組成, parse( void)函數(shù)首先執(zhí)行 getToken()然后 直接調(diào)用declaration_list()返回樹(shù)節(jié)點(diǎn) 代碼 TreeNode * parse(void) { TreeNode * t。 t = declaration_list()。 } return t。 代碼 TreeNode * declaration_list(void) { TreeNode * t = declaration()。 //程序以變量聲明開(kāi)始 while((token!=INT)amp。(token!=VOID)amp。(token!=ENDFILE)) { syntaxError(開(kāi)始不是類型聲明 )。 if(token==ENDFILE) break。 q = declaration()。 } else { psibling=q。 } } } match(ENDFILE)。 } 文法 declaration→ vardeclaration|fundeclaration var_declaration → typespecifier ID。 fundeclatation→ typespecifier ID (params) | poundstmt typespecifier → int | void 分析函數(shù) TreeNode * declaration(void) 說(shuō)明 首先判斷類型,執(zhí)行 match函數(shù), 匹配類型和 ID,向前探測(cè) 1個(gè) token的值確定是函數(shù)聲明還是變量聲明,如果 token為 ’ [’ ,則是數(shù)組變量聲明, 返回節(jié)點(diǎn) Array_DeclK, token為 ’ ( ’ ,則是函數(shù)聲明, 返回節(jié)點(diǎn) FunK, token 為 ’ 。 TreeNode * p = NULL。 TreeNode * s = NULL。 if (token==INT) { p=newNode(IntK)。 } else if (token==VOID) { p=newNode(VoidK)。 } else { syntaxError(type error)。amp。 q = copyString(tokenString)。 if (token==LPAREN) { t = newNode(FunK)。 //p是 t子節(jié)點(diǎn) tchild[1] = q。 tchild[2] = params()。 tchild[3] = pound_stmt()。 a = newNode(Arry_DeclK)。 //p是 t子節(jié)點(diǎn) tchild[1] = a。 s = newNode(ConstK)。 match(NUM)。 achild[1]=s。 match(SEMI)。 tchild[0] = p。 match(SEMI)。 } } else { syntaxError()。 } 文法 params→ param_list | void 分析函數(shù) TreeNode * params(void) 說(shuō)明 參數(shù)列表,根節(jié)點(diǎn) ParamsK,首先判斷 token是否是 VOID,如果是 VOID則匹配,判斷下一個(gè) token,如果是右括號(hào),則參數(shù)列表中只有子節(jié)點(diǎn) VoidK,如果是 ID,則子節(jié)點(diǎn)是param_list,如果開(kāi)始時(shí) token是 INT,則參數(shù)列表子節(jié)點(diǎn)是 param_list 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 14 代碼 TreeNode * params(void) { TreeNode * t = newNode(ParamsK)。 if (token==VOID) { p = newNode(VoidK)。 if (token==RPAREN) { if(t!=NULL) tchild[0] = p。 } } else if (token==INT) { tchild[0] = param_list(p)。 } return t。 param_list(TreeNode * k)函數(shù)使用遞歸向下分析方法直接調(diào)用 param(TreeNode * k)函數(shù),并返回樹(shù)節(jié)點(diǎn) 代碼 TreeNode * param_list(TreeNode * k) { TreeNode * t = param(k)。 k = NULL。 match(COMMA)。 if (q!=NULL) { if (t==NULL) { t=p=q。 p = q。 } 文法 param→ typespecifier ID{[ ]} 分析函數(shù) TreeNode * param(TreeNode * k) 說(shuō)明 探測(cè) token是 INT還是 VOID,決定子節(jié)點(diǎn)類型是 IntK還是 VoidK, IdK作為第二個(gè)子節(jié)點(diǎn),向前探測(cè)一個(gè) token,如果是左中括號(hào),則產(chǎn)生第三個(gè)子節(jié)點(diǎn) 代碼 TreeNode * param(TreeNode * k) { TreeNode * t = newNode(ParamK)。 TreeNode * q = NULL。amp。 match(VOID)。amp。 match(INT)。 } if(p!=NULL) { tchild[0] = p。 q = copyString(tokenString)。 match(ID)。 } if (token==LBRACKETamp。(tchild[1]!=NULL))// { match(LBRACKET)。 match(RBRACKET)。 } } else { syntaxError()。 } 文法 poundstmt→ { localdeclaration statementlist} 分析函數(shù) TreeNode * pound_stmt(void) 說(shuō)明 復(fù)合語(yǔ)句,直接調(diào)用 local_declaration()函數(shù)和 statement_list()函數(shù),產(chǎn)生兩個(gè)子節(jié)四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 17 點(diǎn) 代碼 TreeNode * pound_stmt(void) { TreeNode * t = newNode(CompK)。 tchild[0] = local_declaration()。 match(RCBRACKET)。 } 文法 localdeclarations → empty {var declaration} 分析函數(shù) TreeNode * local_declaration(void) 說(shuō)明 全局變量聲明,可以是空,也可以是若干變量聲明,首先判斷 token是否等于 INT或 VOID,從而得知是否為空,若不為空則創(chuàng)建一個(gè) Var_DeclK節(jié)點(diǎn) 代碼 TreeNode * local_declaration(void) { TreeNode * t = NULL。 TreeNode * p = NULL。 if(token==INT) { TreeNode * q1 = newNode(IntK)。 match(INT)。 pchild[0] = q1。 } if((p!=NULL)amp。(token==ID)) { 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 18 TreeNode * q2 = newNode(IdK)。 pchild[1] = q2。 if(token==LBRACKET) { TreeNode * q3 = newNode(Var_DeclK)。 match(LBRACKET)。 match(SEMI)。 } else { match(SEMI)。 } if(p!=NULL) { if(t==NULL) t = q = p。 q = p。 } 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 19 文法 statementlist→ {statement} 分析函數(shù) TreeNode * statement_list(void) 說(shuō)明 調(diào)用 statement()創(chuàng)建根節(jié)點(diǎn), 向前探測(cè)一個(gè) token,創(chuàng)建兄弟節(jié)點(diǎn) 代碼 TreeNode * statement_list(void) { TreeNode * t = statement()。 while (IF==token || LCBRACKET==token || ID==token || WHILE==token || RETURN ==token || SEMI==token || LPAREN==token || NUM==token) { TreeNode * q。 if(q!=NULL) { if(t==NULL) { t = p = q。 p = q。 } 文法 statement→ expressionstmt| poundstmt | selectionstmt | iterationstmt | returnstmt 分析函數(shù) TreeNode * statement(void) 說(shuō)明 statement 由表達(dá)式或復(fù)合語(yǔ)句或 if 語(yǔ)句或 while 語(yǔ)句或 return 語(yǔ)句構(gòu)成。如果是 IF 則調(diào)用selection_statement(),如果是 WHILE,則調(diào)用 iteration_stmt(),如果是 RETURN,則調(diào)用 return(),如果是左大括號(hào),則是復(fù)合語(yǔ)句類型,如果是 ID、 SEMI、 LPAREN、 NUM,則是表達(dá)式語(yǔ)句類型 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 20 代碼 TreeNode * statement(void) { TreeNode * t = NULL。 break。 break。 break。 break。 break。 token = getToken()。 } return t。 分析函數(shù) TreeNode * expression_stmt(void) 說(shuō)明 說(shuō)明表達(dá)式語(yǔ)句有一個(gè)可選的且后面跟著分號(hào)的表達(dá)式。 if(token==SEMI) { match(SEMI)。 四川大學(xué)《編譯原理課程設(shè)計(jì)》 學(xué)號(hào) 2021141461017 21 } else { t = expression()。 } return t。 if(t==NULL)//不是以 ID開(kāi)頭,只能是 simple_expression情況 { t = simple_expression(t)。 if(token==ASSIGN)//賦值語(yǔ)句 { p = newNode(AssignK)。 match(ASSIGN)。 pchild[1] = expression()。
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1