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

正文內(nèi)容

c語言詞法分析器和c-語言語法分析器編譯原理課程設(shè)計(編輯修改稿)

2024-07-26 07:04 本頁面
 

【文章內(nèi)容簡介】 aration statementlist}分析函數(shù)TreeNode * pound_stmt(void)說明復(fù)合語句,直接調(diào)用local_declaration()函數(shù)和statement_list()函數(shù),產(chǎn)生兩個子節(jié)點代碼TreeNode * pound_stmt(void){ TreeNode * t = newNode(CompK)。 match(LCBRACKET)。 tchild[0] = local_declaration()。 tchild[1] = statement_list()。 match(RCBRACKET)。 return t。}文法localdeclarations → empty {var declaration}分析函數(shù)TreeNode * local_declaration(void)說明全局變量聲明,可以是空,也可以是若干變量聲明,首先判斷token是否等于INT或VOID,從而得知是否為空,若不為空則創(chuàng)建一個Var_DeclK節(jié)點代碼TreeNode * local_declaration(void){ TreeNode * t = NULL。 TreeNode * q = NULL。 TreeNode * p = NULL。 while(token==INT || token==VOID) { p = newNode(Var_DeclK)。 if(token==INT) { TreeNode * q1 = newNode(IntK)。 pchild[0] = q1。 match(INT)。 } else if(token==VOID) { TreeNode * q1 = newNode(VoidK)。 pchild[0] = q1。 match(INT)。 } if((p!=NULL)amp。amp。(token==ID)) { TreeNode * q2 = newNode(IdK)。 q2 = copyString(tokenString)。 pchild[1] = q2。 match(ID)。 if(token==LBRACKET) { TreeNode * q3 = newNode(Var_DeclK)。 pchild[3] = q3。 match(LBRACKET)。 match(RBRACKET)。 match(SEMI)。 } else if(token==SEMI) { match(SEMI)。 } else { match(SEMI)。 } } else { syntaxError()。 } if(p!=NULL) { if(t==NULL) t = q = p。 else { qsibling = p。 q = p。 } } } return t。}文法statementlist→{statement}分析函數(shù)TreeNode * statement_list(void)說明調(diào)用statement()創(chuàng)建根節(jié)點,向前探測一個token,創(chuàng)建兄弟節(jié)點代碼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 = statement()。 if(q!=NULL) { if(t==NULL) { t = p = q。 } else { psibling = q。 p = q。 } } } return t。}文法statement→expressionstmt| poundstmt | selectionstmt | iterationstmt | returnstmt分析函數(shù)TreeNode * statement(void)說明statement由表達(dá)式或復(fù)合語句或if語句或while語句或return語句構(gòu)成。statement(void)函數(shù)通過判斷先行Token類型確定到底是哪一種類型。如果是IF則調(diào)用selection_statement(),如果是WHILE,則調(diào)用iteration_stmt(),如果是RETURN,則調(diào)用return(),如果是左大括號,則是復(fù)合語句類型,如果是ID、SEMI、LPAREN、NUM,則是表達(dá)式語句類型代碼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: t = pound_stmt()。 break。 case ID: case SEMI: case LPAREN: case NUM: t = expression_stmt()。 break。 default: syntaxError()。 token = getToken()。 break。 } return t。}文法expressionstmt→ [expression]。分析函數(shù)TreeNode * expression_stmt(void)說明說明表達(dá)式語句有一個可選的且后面跟著分號的表達(dá)式。expression_stmt(void)函數(shù)通過判斷先行token類型是否為分號,如果不是則直接調(diào)用函數(shù)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 | simpleexpression分析函數(shù)TreeNode * expression(void)說明expression(void)函數(shù)通過判斷先行Token類型是否為ID,如果不是說明只能是simple_expression情況,則調(diào)用simple_expression(TreeNode * k)函數(shù)遞歸向下分析;如果是ID說明可能是賦值語句,或simple_expression中的var和call類型的情況,所以再求其Follow集合,如果集合求出來是賦值類型的Token,則說明是賦值語句,于是新建一個AssignK節(jié)點就行;如果集合求出來不是賦值類型的Token則說明是simple_expression中的var和call類型的情況,然后再調(diào)用simple_expression(TreeNode * k)函數(shù)遞歸向下分析,并將已經(jīng)取出IdK節(jié)點傳遞給simple_expression(TreeNode * k)函數(shù)代碼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)。 pchild[0] = t。 pchild[1] = expression()。 return p。 } else //simple_expression中的var和call類型的情況 { t = simple_expression(t)。 } } return t。}文法var→ID | ID [expression]分析函數(shù)TreeNode * var(void)說明創(chuàng)建IdK節(jié)點,判斷先行token類型是否是中括號,如果是就創(chuàng)建Arry_ElemK節(jié)點,調(diào)用expression()得到子節(jié)點代碼TreeNode * var(void){ TreeNode * t = NULL。 TreeNode * p = NULL。 TreeNode * q = NULL。 if(token==ID) { p = newNode(IdK)。 p = copyString(tokenString)。 match(ID)。 if(token==LBRACKET) { match(LBRACKET)。 q = expression()。 match(RBRACKET)。 t = newNode(Arry_ElemK)。 tchild[0] = p。 tchild[1] = q。 } else { t = p。 } } return t。}文法simpleexpression-additiveexpression{ relop additiveexpression }relop → = | | | = | = = | ! =分析函數(shù)TreeNode * simple_expression(TreeNode * k)說明simple_expression(TreeNode * k)函數(shù)先調(diào)用additive_expression(TreeNode * k)函數(shù)返回一個節(jié)點,然后再一直判斷后面的Token是否為=、=、==、!=,如果是則新建OpK節(jié)點,然后令之前的節(jié)點為其第一個子節(jié)點,然后繼續(xù)調(diào)用additive_expression(TreeNode * k)函數(shù)返回一個節(jié)點,作為OpK節(jié)點的第二個節(jié)點代碼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 = token。 qchild[0] = t。 t = q。 match(token)。 tchild[1] = additive_expression(k)。 return t。 } return t。}5 實驗結(jié)果與分析int a[10]。int min(int a[],int low,void a){ int k。 int x。 int i。 k=low。 while(ilow) { a[0]=1。 if(k0) { x=1。 } } return x。}測試結(jié)果成功實現(xiàn)語法分析6 小結(jié)通過這次實驗,我加深了對語法分析的認(rèn)識,掌握了遞歸向下分析方法,實現(xiàn)了對詞法分析程序所提供的Token序列的語法檢查和結(jié)構(gòu)分析。 語法分析程序編寫相對于詞法分析要困難得多,首先要將BNF化為EBNF,運用遞歸向下的方法進(jìn)行編寫,構(gòu)造出語法樹,判別語法分析過程中是否出錯以及出錯位置和錯誤類型。雖然EBNF轉(zhuǎn)換成代碼的過程原理比較簡單,但是操作起來比較繁瑣。一開始我對TreeNode數(shù)據(jù)結(jié)構(gòu)也不是很理解,通過閱讀書后的tiny語言語法分析源代碼,我弄懂了語法樹的輸出。 附錄(源代碼)include include include /* 全局變量 */int lineno = 0。/* 編譯過程標(biāo)志 */int EchoSource = TRUE。int TraceScan = TRUE。in
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1