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

正文內(nèi)容

ttcn3編譯技術(shù)研究與實(shí)現(xiàn)碩士畢業(yè)論文-閱讀頁

2025-07-13 09:52本頁面
  

【正文】 Clauses : ElseIfClauses| /* 空 */。ElseIfClause : ELSE IF ‘(’ BooleanExpression ‘)’ StatementBlock。ElseClause : ELSE StatementBlock。該沖突是一個移進(jìn)/規(guī)約沖突,用YACC默認(rèn)的方式處理該沖突將導(dǎo)致語法分析器無法識別ELSE語句。optElseClause : ElseClause | /* 空 */。則YACC就能正確地讀入ELSE關(guān)鍵字,并能正確地識別TTCN3的ELSE語句了。如在YACC的語法規(guī)則部分中定義TTCN3的發(fā)送語句時(shí),如果根據(jù)BNF的格式書寫,如下所示的程序,YACC會提示產(chǎn)生了沖突。SendStatement : Port ‘.’ SEND ‘(’SendParameter ‘)’ optToClause 。出現(xiàn)這一沖突的原因是由于在Yacc規(guī)則部分中已經(jīng)定義了:ValueReference : ID ‘.’ ID| ID。由于YACC默認(rèn)的是選擇移進(jìn),于是就按照產(chǎn)生式ValueReference : ID ‘.’ ID來移進(jìn)‘.’(ok),而沒有像預(yù)計(jì)的那樣按照產(chǎn)生式SendStatement :Port ‘.’ SEND ‘(’SendParameter ‘)’ optToClause 來分析,所以就無法識別SEND語句。采用減少嵌套層次的辦法,將以上SendStatement規(guī)則去掉Port規(guī)則的嵌套,使SendStatement中的字符ID和ValueReference中的字符ID處于同一地位,改寫成如下的形式就可以識別SEND語句了:SendStatement : ID ‘.’ SEND ‘( ’SendParameter ‘)’ optToClause | ID ArrayOrBitRef ‘.’SEND‘(’SendParameter‘)’ optToClause。3) 減少嵌套層,并且合并同一語法規(guī)則中各個產(chǎn)生式右端的同類項(xiàng)。FormalValuePar :optInParKeyword Type ValueParIdentifier | optInOutParKeyword Type ValueParIdentifier | optOutParKeyword TypeValueParIdentifier 。optInOutParKeyword : INOUT | /* 空 */。減少嵌套層,并合并同一語法規(guī)則中各個產(chǎn)生式右端的‘空’,以上語法規(guī)則段寫成如下的格式即可去掉沖突:FormalValuePar : IN Type ValueParIdentifier | OUT Type ValueParIdentifier | INOUT Type ValueParIdentifier | Type ValueParIdentifier。 語法樹 分析樹與語法樹簡介分析樹或語法樹是語法分析階段的輸出。在分析樹中,單詞符號表現(xiàn)為分析樹的樹葉,而分析樹的內(nèi)部節(jié)點(diǎn)則表示推導(dǎo)的各個步驟。語法樹[36]是分析樹的壓縮形式,它包含了源代碼的所有信息,而且比分析樹效率更高。表達(dá)式3+4的語法樹如圖35所示。本編譯器采用了兩遍掃描。在這里,語法樹作為中間表示,把代碼生成從語法和語義分析中分離了出來,這是本編譯器完成兩遍掃描的基礎(chǔ)。typedef struct treeNode{ struct treeNode * child[MAXCHILDREN]。 // 定義兄弟節(jié)點(diǎn),以鏈表方式,// 數(shù)量不限 int lineno。 // 記錄節(jié)點(diǎn)的運(yùn)算符號 char * name。 // 記錄節(jié)點(diǎn)標(biāo)志符的值 enum Types type。 在YACC中構(gòu)造語法樹本編譯器的語法樹是在YACC中構(gòu)造的。在本編譯程序中,語法和語義分析的一遍掃描都是依靠這些嵌入式語句來實(shí)現(xiàn)的。然后在YACC中所有的語法規(guī)則中都嵌入相應(yīng)的構(gòu)造語法樹的C代碼 [52]。對其嵌入相應(yīng)的用來構(gòu)造語法樹的語句:SingleVarInstance : Identifier optArrayDef ASSIGN VarInitialValue { $$ = newTreeNode(SINGLEVERINS)。 $$child[1] = $2。 } | Identifier optArrayDef { $$ = newTreeNode(SINGLEVERINS)。 $$child[1] = $2。$$表示左部非終結(jié)符的屬性值,$i表示右部第i個文法符號的值。 $$child[0] = $1表明該新節(jié)點(diǎn)的第一個子節(jié)點(diǎn)是Identifier。 輸出的語法樹語法樹在編譯過程中是一棵樹狀的鏈表結(jié)構(gòu),通過對其節(jié)點(diǎn)進(jìn)行前序遍歷,可以打印每個節(jié)點(diǎn)的信息。 testcase TC_VB_ND_001() runs on NetworkNode { timer RetransTimer。 } }輸出的語法樹是: TTCN3MODULE ND_Behavior MODULEDEF IMPORTDEF IMPORTFROMSPEC MODULEID ND_Architecture RECURSIVE ALLWITHEXPECTS ALL MODULEDEF TESTCASE TC_VB_ND_001 CONFIGSPEC RUNONSPEC COMPONENTTYPE NetworkNode STATEBLOCK TIMERINS SINTIMERINS RetransTimer STARTTIMERSTATEMENT RetransTimer OPTTIMERVAL 按照語法樹的層次結(jié)構(gòu),輸出了每個節(jié)點(diǎn)的名稱,在我們的編譯程序中它和語法規(guī)則左邊的非終結(jié)符名稱一致。 語義分析 語義分析簡介語義分析是編譯過程的第三個階段。程序的語義確定程序的運(yùn)行,但是大多數(shù)的程序設(shè)計(jì)語言都具有在執(zhí)行之前被確定的特征,這些特征被稱作靜態(tài)語義( Static Semantic)[38]。語義分析審查每個語法結(jié)構(gòu)的靜態(tài)語義(以下簡稱為語義),即驗(yàn)證語法結(jié)構(gòu)合法的程序是否真正有意義。在本編譯器中,它與TTCN3的類型、聲明、作用域規(guī)則等密切相關(guān)[16]。,每個節(jié)點(diǎn)都有op,name,type等屬性值。事實(shí)上,每當(dāng)YACC識別出一個語法結(jié)構(gòu),就是完成了一條語法規(guī)則的歸約。 符號表在編譯過程中,編譯程序需要不斷匯集和反復(fù)查證出現(xiàn)在源程序中各種名字的屬性和特征等有關(guān)信息。符號表的每一項(xiàng)都包含兩部分:一部分是名字,另一部分是此名字的有關(guān)信息。編譯過程中每當(dāng)遇到一個名字,都要查找符號表,看其是否存在。當(dāng)某個名字不再有效,還要對其進(jìn)行刪除。與大多數(shù)編譯程序一樣,本編譯器的符號表采用的數(shù)據(jù)結(jié)構(gòu)是散列表 [36]。 while (*lexeme) h = (h2) + (*lexeme++)。}散列表的長度MAX_TAB_SIZE設(shè)為1000。具體的數(shù)據(jù)結(jié)構(gòu)如下:typedef struct node { struct Entry * sentry。} *SEntryList。數(shù)據(jù)結(jié)構(gòu)如下:typedef struct Entry { char *lexeme。 /* 標(biāo)明該符號表表項(xiàng)是哪類聲明 */ enum Types type。 /* 偏移量,標(biāo)明存儲位置 */ enum scopes scope。 struct { /* 該結(jié)構(gòu)體定義了變量聲明的屬性 */ int offset。 …………………………………… struct { /* 該結(jié)構(gòu)體定義了測試?yán)暶鞯膶傩?*/ int offset。 / *為參數(shù)而新建的鏈表 */ SEntryLIST locals。 } unionOfval。 該結(jié)構(gòu)體中定義的成員包括:標(biāo)識符名,標(biāo)識符的類型,以及其它的相應(yīng)于該類標(biāo)識符的屬性。本編譯器中每類聲明的屬性都被定義為一個結(jié)構(gòu)體,由于每個表項(xiàng)的標(biāo)識符只可能屬于一類聲明,所以各類聲明的結(jié)構(gòu)體統(tǒng)一用一個union結(jié)構(gòu)來表示。C語言等由于要遵循最近嵌套作用域規(guī)則,所以在設(shè)計(jì)相關(guān)作用域的屬性時(shí)比較復(fù)雜,通常要定義實(shí)現(xiàn)嵌套功能的屬性。 語義分析的輸出語義分析的結(jié)果是通過檢查,或者發(fā)現(xiàn)語義錯誤。module MyModule { function MyBehaviourA(integer a,integer b) { var integer a。 // 使用的變量c沒聲明過 if(a) // 運(yùn)算語句() { a:=10。 } type ponent NetworkNode { port IPPortType NSAP。 // 的類型與聲明的形參// 的類型不一致 timer RetransTimer。 // timer操作中要求timer值為浮點(diǎn)類型。 // 只有port才可以進(jìn)行send操作,// 類型錯 }}利用嵌入語義分析子程序的語法分析器對其進(jìn)行語義分析,輸出結(jié)果如下,提示Semantic error的地方,表明該行語義有錯誤。 語義分析的錯誤處理由于語義分析是在YACC中嵌入動作實(shí)現(xiàn),并不影響YACC對詞法和語法的分析,因此當(dāng)發(fā)現(xiàn)語義錯誤時(shí)可以不停下來,而是指明錯誤的位置和類型等信息,繼續(xù)往下編譯。 第4章 代碼生成 代碼生成簡介上一章我們討論了在第一遍掃描過程中,如何通過詞法、語法和語義分析生成語法樹和符號表,檢查語義是否正確,并輸出以上過程中發(fā)現(xiàn)的錯誤信息,以便測試控制數(shù)據(jù)定義或描述人員檢查或改正相關(guān)的語句。代碼生成以詞法和語法分析所構(gòu)造的語法樹為主要輸入,結(jié)合符號表來生成本編譯程序的目標(biāo)代碼,即C語言代碼。常用的中間代碼有三地址碼和P代碼[36]。 目標(biāo)代碼的形式本編譯器的目標(biāo)代碼是C++的源代碼,它與編譯程序自身的代碼和工作環(huán)境無關(guān)。同樣基于結(jié)構(gòu)化和可讀性方面的考慮,我們生成的目標(biāo)C++代碼不是全部包含在一個唯一的C++模塊中,而是按TTCN3測試集的結(jié)構(gòu)分為多個模塊,每個模塊包含對TTCN3的Module或單個TestCase的目標(biāo)代碼。將編譯的目標(biāo)代碼文件放在一個目錄下,用C的編譯工具將其單獨(dú)或與其它程序聯(lián)合進(jìn)行編譯、鏈接,就可得到可執(zhí)行程序?;舅惴捎靡韵逻f歸過程描述:procedure genCode( T: treenode ) 。genCode (1st child of T ) 。…genCode (last child of T ) 。 end。在實(shí)際代碼生成時(shí),由于源語言和目標(biāo)語言的構(gòu)造差別,因此對一個樹節(jié)點(diǎn)T的所有子節(jié)點(diǎn)的遞歸調(diào)用不一定完全按照從左到右的順序進(jìn)行;同樣對節(jié)點(diǎn)T本身動作的實(shí)現(xiàn)也可能穿插在對各個子節(jié)點(diǎn)代碼生成之間。代碼生成的實(shí)現(xiàn)主要考慮以下幾個方面:一是對某些不能生成實(shí)際C代碼的語法結(jié)構(gòu)或元素的處理。比如下面的端口類型定義:type port PortType1 mixed{inout MessageType1,MessageType2。其中MessageTypeMessageType2是PortType1類端口允許發(fā)送和接收的數(shù)據(jù)類型,它不能被轉(zhuǎn)換成端口的收發(fā)函數(shù)的形式參數(shù)類型,只能
點(diǎn)擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1