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

正文內(nèi)容

c語言編譯器設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文(參考版)

2025-07-30 09:04本頁面
  

【正文】 28 assignment_expression logical_or_expression { assignment_exp。 {=null} 25 expression_statement expression 。 {= 。其中直接向上傳遞的信息直接封裝在節(jié)點(diǎn)U_node中,包括存儲(chǔ)四元式的code域等,在語法指導(dǎo)定義中則只給出向上傳遞的即為U_node域。 C語義分析程序的實(shí)現(xiàn)將語言結(jié)構(gòu)的語義以屬性(attribute)的形式賦予代表此結(jié)構(gòu)的文法符號(hào),而屬性的計(jì)算以語義規(guī)則(semantic rules)的形式賦予由文法符號(hào)組成的產(chǎn)生式;在語法分析推導(dǎo)或歸約的每一步驟中,通過語義規(guī)則實(shí)現(xiàn)對屬性的計(jì)算,以達(dá)到對語義的處理。 //存放符號(hào)表利用map中key的唯一性,存放符號(hào)表。 //地址}。需要保存一個(gè)記錄表來記錄每一個(gè)變量的在內(nèi)存中的位置(符號(hào)表),每一個(gè)符號(hào)的結(jié)點(diǎn)定義如下:struct idenfierNode{ int type。 C的符號(hào)表在C語義分析程序的符號(hào)表的設(shè)計(jì)中,首先要確定哪些信息需要在符號(hào)表中保存。僅有的布爾型值是兩個(gè)整數(shù)值進(jìn)行比較的結(jié)果。在C中的類型檢查也比較簡單。這一類分析通常包括對“最優(yōu)化”或代碼改進(jìn)技術(shù)的實(shí)現(xiàn)。其他的語言介于這兩種極端情況之間(例如Pascal語言,不像Ada和C對靜態(tài)語義分析的要求那樣嚴(yán)格,也不像LISP那樣完全沒有要求)。對于不同的語言來說,語義分析的差異很大。在一個(gè)典型的靜態(tài)類型的語言(如C語言)中,語義分析的工作通常包括構(gòu)造符號(hào)表、記錄聲明中建立的名字的含義、在表達(dá)式和語句中進(jìn)行類型推斷和類型檢查、在程序的不同作用域范圍內(nèi)判斷變量的合法性。由于它包括了計(jì)算上下文無關(guān)文法和標(biāo)準(zhǔn)語法分析算法以外的信息(即語義信息),因此,它不能被視為語法。語義分析部分以語法分析部分的輸出作為輸入,輸出則是中間代碼甚至目標(biāo)代碼。以上的每一個(gè)步驟都用程序完整實(shí)現(xiàn)。4. LR(1)分析器的工作過程就是在總控程序的控制下,從左到右掃描輸入符號(hào)串,根據(jù)分析棧中的文法符號(hào)和狀態(tài)及當(dāng)前的輸入符號(hào),按分析表的指示完成相應(yīng)的分析動(dòng)作。(Lr:: analyse()函數(shù)中定義stackstack_nodestk。對于不同的文法,分析表各不相同,而總控程序都是一樣的()。其邏輯結(jié)構(gòu)如下圖所示:…aiai+1…總控程序 Snxn…S1X1S0X0 圖42 LR(1)分析具體步驟一個(gè)LR(1)分析器由三部分組成:1. 一個(gè)有待分析的輸入符號(hào)串(c源程序)。LR(1)分析器分析方法:LR(1)分析方法的基本思想是從左至右掃描程序,進(jìn)行自底向上的語法分析,且在分析的每一步既要記住當(dāng)前移進(jìn)和規(guī)約的全部文法符號(hào),又要向前看1個(gè)輸入符號(hào),由此確定棧頂?shù)姆?hào)串是否構(gòu)成相對某一產(chǎn)生式的句柄,從而確定當(dāng)前縮影采取的分析動(dòng)作(移進(jìn)或規(guī)約)。}5) 生成LR(1)分析表,由于分析表的龐大,故將之生成后存于文件中。 } if (()0) //移進(jìn)動(dòng)作,填分析表 { ... } //end if } //end for } //end for delete tmp。 else { cerr Accept conflict\n。amp。amp。 //填規(guī)約時(shí)分析表 } else { cout Reduction conflict state: i endl。amp。 goto_tmp = get_goto(i, str_nxdot)。amp。 int str_nxdot = cfg[cfg_no].right_int[dot_pos]。 size_t cfg_no = closure_item[i][j].cfg_no。 j++) //由I0狀態(tài)擴(kuò)展,直到項(xiàng)目集不再增大為止 { vectoritem_node goto_tmp。 for (size_t j=0。 i()。 //計(jì)算初始項(xiàng)目集I0 static size_t count = 0。 //cerr \nInit items begin...\n。 (*tmp)。 tmpcfg_no = 0。 const int dollar = get_int($)。 vectoritem_node item_tmp。項(xiàng)目集的個(gè)數(shù)即為有窮狀態(tài)自動(dòng)機(jī)的狀態(tài)個(gè)數(shù),根據(jù)以上57個(gè)產(chǎn)生式,本編譯器產(chǎn)生的狀態(tài)為171個(gè)。 } } return get_closure(j)。 //加點(diǎn)位置后移1位 (*p_item)。 p_itemcfg_no = cfg_no。 x!=dollar) { item_node* p_item = new item_node。 cfg[cfg_no].right_int[dot_pos]==x amp。 //對于項(xiàng)目集中的每個(gè)項(xiàng)目,只要加點(diǎn)位置下一個(gè)字符Tag為x,把加點(diǎn)后的項(xiàng)目加入到新項(xiàng)目集 if (cfg[cfg_no].()dot_pos amp。 size_t dot_pos = closure_item[i][k].dot_pos。 kclosure_item[i].size()。 static const int dollar = get_int($)。即是一個(gè)項(xiàng)目集遇到輸入代碼流中的一個(gè)符號(hào)后轉(zhuǎn)向的另一個(gè)狀態(tài)時(shí)候的項(xiàng)目集,并將之返回。 if (is_nonterminal(non_tml)) //加點(diǎn)位置下一個(gè)字符是非終結(jié)符,繼續(xù)擴(kuò)展 { ... } //end if } //end for return closure。 //加點(diǎn) int prefix = closure[pos].possible_prefix。pos++) //對于closure的每一個(gè)項(xiàng)目依次求 { size_t cfg_no = closure[pos].cfg_no。closure){ for (size_t pos=0。項(xiàng)目集閉包具體實(shí)現(xiàn):vectoritem_nodeamp。例如 {S ,}假設(shè)是第n個(gè)產(chǎn)生式,cfg_no = n, dot_pos=2,possible_prefix=””的編號(hào)。 //可能出現(xiàn)輸入符號(hào)的Tag}。 //產(chǎn)生式編號(hào) size_t dot_pos。閉包利用集合的唯一性,故使用C++標(biāo)準(zhǔn)STL庫中的set模板。為方便以后訪問,求完所有非終結(jié)符的first集后將它放在一個(gè)以非終結(jié)符為鍵的hash表中。由于分析表非常大(171行,57列),故采用機(jī)械算法構(gòu)造。 LR(1)語法分析關(guān)鍵的步驟是構(gòu)造LR(1)分析表。 //文法右部的鍵值放入對應(yīng)的vector}。 //左部多對應(yīng)的鍵值 vectorstring right。 //存放非終結(jié)符數(shù)值形式的集合文法結(jié)點(diǎn)結(jié)構(gòu)體:struct cfg_node{ string left。 //string符號(hào)集 setint terminal。 //文法結(jié)點(diǎn)數(shù)組 vectorint table_head。Grammer類的構(gòu)造函數(shù)用來初始化ReadCfg類的成員變量,成員變量定義為protected型,方便Grammer類直接取到。分析表由來Grammer類來表示。 C語法分析程序的實(shí)現(xiàn)在實(shí)現(xiàn)C的語法分析器時(shí),采用的核心算法是自底而上的LR(1)分析方法。另外,變量只有全局作用域。C中的標(biāo)識(shí)符指的是簡單整型變量,它沒有類似數(shù)組或記錄等類型的變量。比較運(yùn)算符的優(yōu)先權(quán)都低于算術(shù)運(yùn)算符。布爾表達(dá)式使用比較運(yùn)算符“=”和“”,通常用在if語句和while語句中作為測試條件;算術(shù)表達(dá)式使用整型運(yùn)算符“+”、“”、“*”、“/”,它們具有左結(jié)合和常規(guī)的優(yōu)先關(guān)系。10expression_statement4111external_declaration42=12function_definition43=13function_name44==14iteration_statement4515jump_statement46=16logical_or_expression47break17logical_and_expression48continue18multiplicative_expression49double19parameter50double_num20primary_expression51e21relational_expression52id22selection_statement53if23statement54int24statement_list55int_num25translation_unit56return26type_specifier57void27 while28{29||30}31表43 C的終結(jié)符和非終結(jié)符我們可以從表42中閱讀出本實(shí)驗(yàn)C的語法規(guī)則:C程序只是一個(gè)語句序列,它共有5種語句:if語句、while語句、賦值語句。amp。這些編碼都是由程序自動(dòng)算出,如表43所示。 56 jump_statement return expression 。 54 jump_statement break 。amp。 25 expression_statement expression 。下面是總結(jié)出來的c語言的文法,總共有57條規(guī)則:1 S0 translation_unit 2 translation_unit external_declaration 3 external_declaration function_definition 4 external_declaration declaration 5 declaration type_specifier id 。4. 文法的開始符號(hào)S0。規(guī)則形如type_specifier void。2. 一個(gè)中間字母集,稱為非終結(jié)符,記為nontermanal,一般出現(xiàn)在規(guī)則左部的符號(hào)都是非終結(jié)符。一個(gè)文法必須由4部分組成:1. 字母表,表中的字符成為終結(jié)符。 C語言抽象出來的文法規(guī)則文法是為了深入研究語言的內(nèi)在性質(zhì),而構(gòu)造語言的方法。對于一般使用的程序設(shè)計(jì)語言的文法而言,若手工構(gòu)造分析程序,則工作量太大,而且K越大,構(gòu)造越復(fù)雜,實(shí)現(xiàn)越困難。由于LR(K)分析方法對文法限制很少,因而大多數(shù)能用上下文無關(guān)文法描述的程序設(shè)計(jì)語言都可用LR分析法進(jìn)行有效分析,而且LR分析效率不亞于自頂向下分析法好、算法優(yōu)先分析法,及其他“移進(jìn)規(guī)約”分析法。LR(K)分析法能根據(jù)分析棧的當(dāng)前內(nèi)容以及向前看輸入串的K個(gè)字符來決定分析動(dòng)作移進(jìn)還是規(guī)約。LR(K)。重復(fù)這一過程直到歸約到棧中只剩文法的開始符號(hào)時(shí)則為分析成功,也就確認(rèn)輸入串是文法的句子。自底向上分析法,也稱移進(jìn)歸約分析法。自底而上又分為簡單優(yōu)先文法、算符優(yōu)先文法、LR(K)分析方法。目前語法分析方法有多種多樣,大致分為自頂而下和自底而上兩大類。 } } return Token()。\039。 line[0] = c。 c \39。39。39。 case 39。:39。: return (Token(get_int(.),.))。 case 39。,39。))。: return (Token(get_int(。 case 39。39。: return (Token(get_int(}), }))。 case 39。{39。: return (Token(get_int(]), ]))。 case 39。[39。: return (Token(get_int()), )))。 case 39。(39。~39。|39。39。: {...} case 39。: {...} case 39。: {...} case 39。: {...} case 39。: {...} case 39。: {...} case 39。: {...} case 39。: {...} case 39。 else //其他 { switch(c) //對字符進(jìn)行分析 { case 39。)) { //處理注釋 } //end while if (isalpha(c)) //字母 return (alpha_process())。 || ()==39。 (()==39。 amp。 } //遇到注釋的情況 while (c==39。) //遇到空格或者制表符 continue。 || c==39。 //行數(shù)+1 else if (c==39。\n39。 while (true) { if ((c)==NULL)
點(diǎn)擊復(fù)制文檔內(nèi)容
語文相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1