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

正文內(nèi)容

c語言編譯器設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文-資料下載頁

2025-07-27 09:04本頁面
  

【正文】 ot_pos。 int prefix = closure_item[i][k].possible_prefix。 //對(duì)于項(xiàng)目集中的每個(gè)項(xiàng)目,只要加點(diǎn)位置下一個(gè)字符Tag為x,把加點(diǎn)后的項(xiàng)目加入到新項(xiàng)目集 if (cfg[cfg_no].()dot_pos amp。amp。 cfg[cfg_no].right_int[dot_pos]==x amp。amp。 x!=dollar) { item_node* p_item = new item_node。 p_itempossible_prefix = prefix。 p_itemcfg_no = cfg_no。 p_itemdot_pos = dot_pos+1。 //加點(diǎn)位置后移1位 (*p_item)。 delete p_item。 } } return get_closure(j)。 //求得新項(xiàng)目集并返回}4) 求整個(gè)文法的項(xiàng)目集簇。項(xiàng)目集的個(gè)數(shù)即為有窮狀態(tài)自動(dòng)機(jī)的狀態(tài)個(gè)數(shù),根據(jù)以上57個(gè)產(chǎn)生式,本編譯器產(chǎn)生的狀態(tài)為171個(gè)。項(xiàng)目集族具體的生成:size_t Grammar::make_items(){ init_item()。 vectoritem_node item_tmp。 item_node* tmp = new item_node。 const int dollar = get_int($)。 tmppossible_prefix = dollar。 tmpcfg_no = 0。 tmpdot_pos = 0。 (*tmp)。 time_t time_s = time(NULL)。 //cerr \nInit items begin...\n。 (get_closure(item_tmp))。 //計(jì)算初始項(xiàng)目集I0 static size_t count = 0。 for (size_t i=0。 i()。 i++) { setint set_temp。 for (size_t j=0。 jclosure_item[i].size()。 j++) //由I0狀態(tài)擴(kuò)展,直到項(xiàng)目集不再增大為止 { vectoritem_node goto_tmp。 int prefix = closure_item[i][j].possible_prefix。 size_t cfg_no = closure_item[i][j].cfg_no。 size_t dot_pos = closure_item[i][j].dot_pos。 int str_nxdot = cfg[cfg_no].right_int[dot_pos]。 if (str_nxdot!=dollar amp。amp。 (str_nxdot)==()) { // (str_nxdot)。 goto_tmp = get_goto(i, str_nxdot)。 } else { //2. 規(guī)約R(j) begin if (cfg_no!=0 amp。amp。 dot_pos==cfg[cfg_no].()1) { if (action_goto[i][prefix]==ERROR) { action_goto[i][prefix] = (int)cfg_no。 //填規(guī)約時(shí)分析表 } else { cout Reduction conflict state: i endl。 } } //3. 接受Accept if (cfg_no==0 amp。amp。 prefix==dollar amp。amp。 dot_pos==cfg[cfg_no].()1) { if (action_goto[i][dollar]==Token::ERROR) action_goto[i][dollar] = Token::ACC。 else { cerr Accept conflict\n。 } } //end continue。 } if (()0) //移進(jìn)動(dòng)作,填分析表 { ... } //end if } //end for } //end for delete tmp。 return ()。}5) 生成LR(1)分析表,由于分析表的龐大,故將之生成后存于文件中。6) 完成LR分析器,讀入第5步的分析表即可進(jìn)行語法分析。LR(1)分析器分析方法:LR(1)分析方法的基本思想是從左至右掃描程序,進(jìn)行自底向上的語法分析,且在分析的每一步既要記住當(dāng)前移進(jìn)和規(guī)約的全部文法符號(hào),又要向前看1個(gè)輸入符號(hào),由此確定棧頂?shù)姆?hào)串是否構(gòu)成相對(duì)某一產(chǎn)生式的句柄,從而確定當(dāng)前縮影采取的分析動(dòng)作(移進(jìn)或規(guī)約)。一個(gè)自底向上的分析器也是一臺(tái)下推自動(dòng)機(jī),該下推自動(dòng)機(jī)具有一個(gè)給定的輸入符號(hào)串、一個(gè)下推分析棧和一個(gè)有窮的控制結(jié)構(gòu)。其邏輯結(jié)構(gòu)如下圖所示:…aiai+1…總控程序 Snxn…S1X1S0X0 圖42 LR(1)分析具體步驟一個(gè)LR(1)分析器由三部分組成:1. 一個(gè)有待分析的輸入符號(hào)串(c源程序)。2. 一個(gè)控制結(jié)構(gòu),其中包括一個(gè)總控程序和一張分析表。對(duì)于不同的文法,分析表各不相同,而總控程序都是一樣的()。3. 一個(gè)先進(jìn)后出的下推分析棧,其中包括文法符號(hào)棧和相應(yīng)狀態(tài)棧。(Lr:: analyse()函數(shù)中定義stackstack_nodestk。)。4. LR(1)分析器的工作過程就是在總控程序的控制下,從左到右掃描輸入符號(hào)串,根據(jù)分析棧中的文法符號(hào)和狀態(tài)及當(dāng)前的輸入符號(hào),按分析表的指示完成相應(yīng)的分析動(dòng)作。(Lr:: analyse()函數(shù)的功能)。以上的每一個(gè)步驟都用程序完整實(shí)現(xiàn)。 語義分析階段 概述簡(jiǎn)單地說,語義分析就是分析語法結(jié)構(gòu)含義,表示成中間語言或生成目標(biāo)指令。語義分析部分以語法分析部分的輸出作為輸入,輸出則是中間代碼甚至目標(biāo)代碼。語義分析是一個(gè)用于計(jì)算編譯過程中所需的附加語義信息的階段。由于它包括了計(jì)算上下文無關(guān)文法和標(biāo)準(zhǔn)語法分析算法以外的信息(即語義信息),因此,它不能被視為語法。語義信息的計(jì)算與被翻譯程序的最終含義或語義密切相關(guān),因?yàn)榫幾g器完成的語義分析是靜態(tài)定義(在程序執(zhí)行之前予以明確的),所以語義分析也可稱作靜態(tài)語義分析。在一個(gè)典型的靜態(tài)類型的語言(如C語言)中,語義分析的工作通常包括構(gòu)造符號(hào)表、記錄聲明中建立的名字的含義、在表達(dá)式和語句中進(jìn)行類型推斷和類型檢查、在程序的不同作用域范圍內(nèi)判斷變量的合法性。語義分析可以分為兩類[12]:(1) 第一類分析是正確性分析,要求根據(jù)編程語言的語義規(guī)則判定程序的正確性,并保證它能正確執(zhí)行。對(duì)于不同的語言來說,語義分析的差異很大。比如在LISP和Smalltalk這類動(dòng)態(tài)制導(dǎo)的語言中,可能完全沒有靜態(tài)語義分析;而在Ada或C這類語言中就有很強(qiáng)的靜態(tài)語義分析需求,程序必須提交執(zhí)行。其他的語言介于這兩種極端情況之間(例如Pascal語言,不像Ada和C對(duì)靜態(tài)語義分析的要求那樣嚴(yán)格,也不像LISP那樣完全沒有要求)。(2) 第二類分析是優(yōu)化性分析,是由編譯程序執(zhí)行的用于提高翻譯程序執(zhí)行效率的分析。這一類分析通常包括對(duì)“最優(yōu)化”或代碼改進(jìn)技術(shù)的實(shí)現(xiàn)。 C語言的語義C語言在靜態(tài)語義方面的要求比較簡(jiǎn)單,分析是由程序Lr類負(fù)責(zé)的。在C中的類型檢查也比較簡(jiǎn)單。它只有兩種類型:整型和布爾型。僅有的布爾型值是兩個(gè)整數(shù)值進(jìn)行比較的結(jié)果。因?yàn)闆]有布爾型運(yùn)算符或變量,所以布爾值只出現(xiàn)在if或while語句的條件測(cè)試表達(dá)式中,不作為運(yùn)算符的操作數(shù)或賦值給變量的值。 C的符號(hào)表在C語義分析程序的符號(hào)表的設(shè)計(jì)中,首先要確定哪些信息需要在符號(hào)表中保存。一般情況下,符號(hào)表需要包括數(shù)據(jù)類型和作用域信息,但考慮到本實(shí)驗(yàn)C語言本身沒有作用域信息,因此C符號(hào)表也就不需要保存這些信息了。需要保存一個(gè)記錄表來記錄每一個(gè)變量的在內(nèi)存中的位置(符號(hào)表),每一個(gè)符號(hào)的結(jié)點(diǎn)定義如下:struct idenfierNode{ int type。 //類型 int addr。 //地址}。圖43 符號(hào)表表示形式mapstd::string, idenfierNode idTable。 //存放符號(hào)表利用map中key的唯一性,存放符號(hào)表。符號(hào)表的處理也伴隨著語法分析來同時(shí)生成維護(hù)。 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)對(duì)屬性的計(jì)算,以達(dá)到對(duì)語義的處理。語法制導(dǎo)定義中,需要對(duì)文法進(jìn)行處理,加上一個(gè)只能產(chǎn)生終結(jié)符空(e)的非中介符號(hào)M,這一步已經(jīng)在第3部分的文法給出來,以下是每一個(gè)產(chǎn)生式的語法指導(dǎo)定義。其中直接向上傳遞的信息直接封裝在節(jié)點(diǎn)U_node中,包括存儲(chǔ)四元式的code域等,在語法指導(dǎo)定義中則只給出向上傳遞的即為U_node域。1 S0 translation_unit { = } //直接向上傳遞2 translation_unit external_declaration { translation_unit .nodeInfo=, //直接向上傳遞 = || gen(“halt”)} 3 external_declaration function_definition { = } 4 external_declaration declaration {=}5 declaration type_specifier id 。 {= 。 =new Temp()} 6 type_specifier void {=IS_VOID, =} 7 type_specifier int { =IS_INT, =} 8 type_specifier double {=IS_DOUBLE,type_specifier .=} 9 function_definition type_specifier function_name parameter pound_statement { =||||||} 10 function_name id { = , =new Temp()} 11 parameter ( ) {=null} 12 pound_statement “{” decalration_list “ }” {pound_statement .nodeInfo=} 13 pound_statement “{” statement_list “}” { pound_statement .nodeInfo=} 14 pound_statement “{” decalration_list statement_list “}” {pound_statement .=||} 15 decalration_list declaration { =} 16 decalration_list decalration_list declaration { decalration_list .=||} 17 statement_list statement { statement_list .nodeInfo = } 18 statement_list statement_list statement { = +} 19 statement pound_statement {=} 20 statement expression_statement {=} 21 statement selection_statement M {=, backpatch(, )}//回填選擇跳轉(zhuǎn)出口 22 statement iteration_statement M {=backpatch(, )} //回填循環(huán)跳轉(zhuǎn)出口 23 statement jump_statement {=} 24 expression_statement 。 {=null} 25 expression_statement expression 。 {=} 26 expression assignment_expression {=} 27 assignment_expression primary_expression = assignment_expression {=new Temp()=|||| gen(,“=”, “=”)=nextInstr。 28 assignment_expression logical_or_expression { assignment
點(diǎn)擊復(fù)制文檔內(nèi)容
語文相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1