欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法

文檔序號:6560888閱讀:190來源:國知局

專利名稱::LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法
技術(shù)領(lǐng)域
:本發(fā)明涉及文法的斷點(diǎn)調(diào)試技術(shù),提出了一種LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法,它可顯著增加可跟蹤和調(diào)試的斷點(diǎn)數(shù)目,幫助用戶更好地進(jìn)行文法調(diào)試。
背景技術(shù)
:分析器生成器(parsergenerator)在分析器(parser)和編譯前端(compilerfrontend)構(gòu)造中得到了廣泛應(yīng)用,越來越多的開發(fā)者使用分析器自動生成工具來生成分析器或編譯前端。與編譯領(lǐng)域的專家不同,這些普通開發(fā)者往往對分析理論并不熟悉,而且他們也不是經(jīng)常開發(fā)此類分析工具。對于這類開發(fā)者而言,良好的文法調(diào)試支持是不可或缺的,可以有效降低分析器開發(fā)的復(fù)雜性,提高開發(fā)效率。即使對編譯領(lǐng)域的專家而言,良好的文法調(diào)試支持也可以幫助他們更快更好地開發(fā)分析器。對于LL(k)文法,一些經(jīng)典的源碼調(diào)試工具,比如GNU的gbd調(diào)試器、微軟的VisualC4"+調(diào)試器等,可以用來展示LL分析方法采用的遞歸下降分析器(recursivedescentparser)的分析過程,這是因?yàn)長L文法和它對應(yīng)的遞歸下降分析器之間有很明顯的結(jié)構(gòu)對應(yīng)關(guān)系,借助這些經(jīng)典的源碼調(diào)試工具,開發(fā)者就可以對分析過程有較好的理解。然而,LR(k)文法卻無法利用這些經(jīng)典的源碼調(diào)試工具,主要原因在于LR(k)采用的是自底向上的分析方法,LR(k)文法和其對應(yīng)的分析器之間并無結(jié)構(gòu)上的對應(yīng)關(guān)系。為流行的程序設(shè)計(jì)語言,如C+十、Ada等開發(fā)LR0O分析器,需要非常專業(yè)的知識和技能,只有很少的開發(fā)者可以開發(fā)此類分析器。LR(k)文法是支持確定性分析的最大文法類,LR(k)文法及其子類在各類分析器生成器(parsergenerator)中有廣泛應(yīng)用。相比于LL(k)文法,LR(k)文法所能描述的文法范圍要寬泛得多,可以表示當(dāng)今大多數(shù)編程語言的文法,可以處理左遞歸,應(yīng)用非常廣泛,因此,迫切需要良好的LR(k)文法調(diào)試技術(shù)支持。軟件可視化(Softwarevisualization,簡稱SV),是一種利用圖形手段增強(qiáng)用戶對程序理解的技術(shù)。目前已出現(xiàn)了一些基于SV、采用自底向上分析方法的分析器生成器,如J7racc,77,F/^fl//^"++,丄/w,;,^朋Gra/n等。這些工具可以展示LR(k)分析器使用的確定性下推自動機(jī)(deterministicpushdownautomaton)的分析過程,如符號^(symbo1stack),語法樹(syntaxtree),當(dāng)前使用的產(chǎn)生式(production)及向前看符號(lookahead)等,可以幫助用戶較好地理解分析過程。斷點(diǎn)是一種經(jīng)典直觀的調(diào)試支持手段,廣泛應(yīng)用于各類基于SV技術(shù)的調(diào)試器(debugger)中?;蛟S斷點(diǎn)調(diào)試是目前最為人們熟悉的調(diào)試方式了。目前采用的LR(k)文法的斷點(diǎn)調(diào)試技術(shù)存在一個不足,即只允許在產(chǎn)生式右部末尾設(shè)置斷點(diǎn),不允許在產(chǎn)生式右部的中間位置設(shè)置斷點(diǎn)。比如,對于圖l所示文法,傳統(tǒng)的斷點(diǎn)調(diào)試方法只允許在圖中粗黑點(diǎn)標(biāo)注的位置設(shè)置斷點(diǎn),不允許在其它位置設(shè)置斷點(diǎn)。這是LR(k)分析方法的一個固有屬性,因?yàn)闃?biāo)準(zhǔn)的LR(k)分析方法不支持產(chǎn)生式內(nèi)部的語義動作調(diào)用,無法暫停分析過程以查看分析狀態(tài)信息。只允許在產(chǎn)生式右部末尾而不允許在產(chǎn)生式右部的其它位置設(shè)置斷點(diǎn),給用戶的調(diào)試帶來了不便。比如,對于圖l中的Rulel,如果想在分析器識別了"+"后查看分析器的分析狀態(tài),目前的LR(k)文法調(diào)試技術(shù)卻并不支持,因?yàn)椴辉试S在"+"之后設(shè)置一個斷點(diǎn),除非用戶手工在"+"之后添加了一個新的無用非終結(jié)符號(millnontermhml)X,如圖2所示,并且在新增加的產(chǎn)生式的末尾設(shè)置一個斷點(diǎn)(Rule3)。由用戶手工添加無用非終結(jié)符會帶來一系列的弊端。首先,這種方式修改了原始文法損害了文法的可讀性;其次,給用戶增加了額外的處理負(fù)擔(dān);第三,這些無用非終結(jié)符本質(zhì)上并不是原始文法的一部分,因此在調(diào)試完畢后,它們必須從文法中刪除,這樣,用戶每次設(shè)置一個斷點(diǎn),都要手工添加一個無用非終結(jié)符,當(dāng)調(diào)試完畢又不得不刪除,這給用戶的調(diào)試帶來了很大的不便;最后,在LR(k)文法中添加無用非終結(jié)符可能會引入新的分析沖突,造成更改后的文法不再是LR(k)文法,從而導(dǎo)致分析過程失敗。比如,圖l所示文法是一個LR(k)文法,如果在Ruel的右邊開始位置添加一個無用非終結(jié)符,將導(dǎo)致更改后的文法不再是LR(k)文法(圖3),
發(fā)明內(nèi)容有鑒于此,本發(fā)明的目的是提出一種新的斷點(diǎn)調(diào)試方法,該方法可顯著增加可跟蹤和調(diào)試的斷點(diǎn)數(shù)目,從而可以跟蹤到更細(xì)粒度的語法成分。為此,本發(fā)明采用以下技術(shù)方案一種LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法,它包括如下步驟定義語言的LR(k)文法或者LR(k)文法的子類文法G;用戶在相應(yīng)的文法位置插入斷點(diǎn);檢査用戶設(shè)置的每一個斷點(diǎn),如果該斷點(diǎn)設(shè)置在某個產(chǎn)生式右部末尾,則什么都不做,如果該斷點(diǎn)設(shè)置在產(chǎn)生式右部中間的某個文法位置,則自動添加相應(yīng)的無用非終結(jié)符號,從而得到一個新的文法G';為新的文法G'生成分析表;計(jì)算每個斷點(diǎn)的類型,從而得到每個斷點(diǎn)是有效斷點(diǎn)、無效斷點(diǎn),還是不確定斷點(diǎn);利用LR(k)分析方法或者其子類分析方法分析輸入串,直到遇到一個歸約動作,檢查該歸約動作處是否對應(yīng)一個斷點(diǎn),如果對應(yīng)一個斷點(diǎn),則根據(jù)不同的斷點(diǎn)類型采取如下動作如果是一個有效斷點(diǎn),則暫停分析過程,顯示當(dāng)前的分析狀態(tài)信息;如果是一個無效斷點(diǎn),則忽略該斷點(diǎn),繼續(xù)分析過程;如果是一個不確定斷點(diǎn),則采用以下兩種方法之一一種方法是簡單忽略這些不確定斷點(diǎn),繼續(xù)分析過程;另一種方法是結(jié)合當(dāng)前的輸入串和斷點(diǎn)設(shè)置位置,進(jìn)一步判斷該位置是否有效,如果對于當(dāng)前的輸入串,該位置是有效的,則按照有效斷點(diǎn)位置處理,如果對于當(dāng)前輸入串,該位置是無效的,則忽略該位置,繼續(xù)分析過程。本發(fā)明方法的優(yōu)點(diǎn)在于支持在產(chǎn)生式右部任意文法位置插入斷點(diǎn),可顯著增加可跟蹤和調(diào)試的斷點(diǎn)數(shù)目,從而可以跟蹤到更細(xì)粒度的語法成分:本發(fā)明方法對用戶完全透明,不會給用戶增加任何處理負(fù)擔(dān),用戶用起來簡單直觀;本方法很容易集成到現(xiàn)有的分析器生成框架中;本發(fā)明可幫助用戶更好地進(jìn)行文法調(diào)試,可在一定程度上降低分析器的開發(fā)難度。其中的斷點(diǎn)類型分類算法可以區(qū)分不同的斷點(diǎn)類型,可以更好的指導(dǎo)分析過程,同時又不會引入任何新的分析沖突。圖1表示一個LR(l)文法;圖2表示添加一個無用非終結(jié)符到圖1所示文法;圖3表示增加無用非終結(jié)符給文法引入了新的沖突;圖4表示在產(chǎn)生式右部的中間位置中間插入一個斷點(diǎn);圖5表示一個文法的文法位置;圖6表示一個支持加法和乘法的算術(shù)表達(dá)式文法;圖7表示圖6所示文法的初始結(jié)點(diǎn)的一個部分狀態(tài)位置圖;圖8表示一個示例文法G;圖9表示圖8所示文法的初始狀態(tài)對應(yīng)的兩個PSPG;圖10表示合并圖9中的兩個pspg中的相同結(jié)點(diǎn)得到的spg;圖11表示一個狀態(tài)數(shù)隨n增大呈指數(shù)規(guī)模增長的LR(k)文法。具體實(shí)施方式本發(fā)明提出了一種新穎的LR(k)文法斷點(diǎn)調(diào)試方法,它支持在產(chǎn)生式右部任意文法位置(grammarposition)插入斷點(diǎn)。比如,對于上面討論的問題,如果用戶想要在識別"十"后查看分析狀態(tài)信息,我們的調(diào)試方法支持在"+"之后直接設(shè)置一個斷點(diǎn)(圖4)。本發(fā)明還提出了一種方法來區(qū)分有效、無效和不確定斷點(diǎn)位置。本發(fā)明可以顯著增加可利用的斷點(diǎn)數(shù)量,用戶可以跟蹤到更細(xì)粒度的文法片斷,可以幫助用戶更好的理解分析過程。1相關(guān)定義為了后文論述方便,此處給出本發(fā)明用到的一些相關(guān)術(shù)語的定義。對于在本發(fā)明中涉及的文法、語言和分析技術(shù)方面的基礎(chǔ)知識,請參考編譯原理教科書中的相應(yīng)內(nèi)容。上下文無關(guān)文法(context-freegrammar)一個上下文無關(guān)文法是一個四元式g=:(wt:^》,其中iV代表文法的非終結(jié)符集合,r代表終結(jié)符號集合,戶是文法的產(chǎn)生式集合,s是文法的開始符號。LR(k)文法LR(k)文法是上下文無關(guān)文法的子類,它是能夠被一個最多預(yù)讀k個向前看符號就可以識別的確定性的移進(jìn)-歸約(shift-reduce)分析器(亦稱遞歸上升分析器(recursiveascentparser))所能識別的最大文法類,文法位置(grammarposition),三E要位置(mainposition)和導(dǎo)出位置(derivedposition)一個文法位置是一個形如[/,/]的二元組,這里/代某個產(chǎn)生式p的編號,y代表p右部的某個位置,0$2產(chǎn)生式p右部的符號數(shù)目。編號為o的產(chǎn)生式的左部符號是文法的開始符號。位置[u']表示產(chǎn)生式/的右部第/個符號之后的位置。位置[o,w和[/,刀稱為主要位置,位置[/,稱為導(dǎo)出位置。圖5列出了圖i所示文法的文法位置。項(xiàng)目(item),初始項(xiàng)目(initialitem),主要項(xiàng)目(mainitem)和導(dǎo)出項(xiàng)目(deriveditem)文法G的一個項(xiàng)目是一個三元組[/,/,yj,此處[/,/j表示一個文法位置,y是向前看符號(對于某些簡單的分析器,如LR(0)分析器,向前看符號可省略)。項(xiàng)目[/,j',y]也可用形如^(—aWM的形式表示,其中J—a'y5表示文法位置[7,y],y是向前看符號。是文法的初始項(xiàng)目,此處S是文法的結(jié)束符。項(xiàng)目[z',y',y]是一個主要項(xiàng)目當(dāng)且僅當(dāng)[/,y〗是一個主要位置。項(xiàng)目[/,/,y]是一個導(dǎo)出項(xiàng)目當(dāng)且僅當(dāng)[/,/I是一個導(dǎo)出位置。分析器的一個狀態(tài)(state)可以由它的主要項(xiàng)目集合(mainitemsset)唯一地確定。為了區(qū)分不同的斷點(diǎn),我們引入了以下幾個新的概念有效斷點(diǎn)位置(validbreakpointposition),無效斷點(diǎn)位置(invalidbreakpointposition)和不確定斷點(diǎn)位置(indeterminatebreakpointposition)。對一個LR(k)文法G,假定f'是不包含位置[/,/|的任意文法位置的集合,令£"=£'u[/,/],即£"是£鄰[!',/|的并集,在文法G的文法位置集合f'處插入無效非終結(jié)符后得到的文法為G',在文法G的文法位置集合f"處插入無效非終結(jié)符后得到的文法為G"。則文法位置[z,/1是一個有效斷點(diǎn)位置,當(dāng)且僅當(dāng)對于所有的£',g'和g"要么都是LR(k)文法,要么都不是LR(k)文法;文法位置[/,/|是一個無效斷點(diǎn)位置,當(dāng)且僅當(dāng)對于每一個£',G"都不是LR(k)文法;文法位置[/,/1是一個不確定斷點(diǎn)位置,當(dāng)且僅當(dāng)對于某些£'的集合但不是所有的£'集合,G"不是LR(O文法。部分狀態(tài)(partialstate),部分狀態(tài)位置圖(partialstatepositiongraph,后文簡稱PSPG),狀態(tài)位置圖(statepositiongraph,后文簡稱SPG)部分狀態(tài)(partialstate)是由Purdom和Brown等提出的一個概念,-個狀態(tài)的部分狀態(tài)包括(1)任何可以移入-個終結(jié)符或者用產(chǎn)生式歸約的項(xiàng)目,記這樣的項(xiàng)目為d;(2)任何可以推導(dǎo)出d的主要項(xiàng)目,記這些主要項(xiàng)目為M;(3)任何包含在M的閉包c(diǎn)losure(M)中并且可以推導(dǎo)出d的項(xiàng)目(關(guān)于閉包的概念,請參考編譯原理教科書)。對每一個部分狀態(tài),都對應(yīng)一個部分狀態(tài)位置圖(PSPG)。每一個PSPG都包含一個初始結(jié)點(diǎn)(記為I),一個終止結(jié)點(diǎn)(記為E),部分狀態(tài)中和每個項(xiàng)目相關(guān)聯(lián)的每個文法位置[f,刀都對應(yīng)PSPG中的一個中間結(jié)點(diǎn)。PSPG是一個有向圖,圖中的弧表示項(xiàng)目間的s轉(zhuǎn)換關(guān)系(e-transition)。從I到M中的每一個項(xiàng)目都有一條弧,從每一個d到E也有一條弧。對于每條形如a—6弧,此處fl和6既不是初始結(jié)點(diǎn),也不是終止結(jié)點(diǎn),表示a可以經(jīng)過一次s轉(zhuǎn)換到6。除了初始結(jié)點(diǎn)和終止結(jié)點(diǎn)外的每個結(jié)點(diǎn)都表示一個文法位置。圖6是一個算術(shù)表達(dá)式文法,表1列出了初始狀態(tài)及初始狀態(tài)的狀態(tài)轉(zhuǎn)換關(guān)系。圖7是給出了初始結(jié)點(diǎn)的一個PSPG示例。<table>tableseeoriginaldocumentpage7</column></row><table>表1Purdom等的方法中存在一個不足,即對于同-個分析狀態(tài)可能會構(gòu)造多個PSPG。歐陽士庭等提出了一種改進(jìn)的方法,該方法通過合并同一個狀態(tài)中所有PSPG中的相同結(jié)點(diǎn),從而得到一個新的圖,歐陽等稱該圖為SPG(statepositiongraph)。這樣,對于一個狀態(tài),只需要構(gòu)造一個SPG即可。對于圖8所示文法中的始態(tài),圖9中(為了簡單起見,向前看符號圖中沒有標(biāo)出)給出了它對應(yīng)的兩個PSPG。在圖9中,結(jié)點(diǎn)1和6,結(jié)點(diǎn)2和7都是相同的結(jié)點(diǎn),合并這些相同的結(jié)點(diǎn)以后得到的SPG如圖10所示。決定結(jié)點(diǎn)(dominator),前驅(qū)決定結(jié)點(diǎn)(predominator),直接前驅(qū)決定結(jié)點(diǎn)(immediatepredominator)對于有向圖G=RA小其中r表示頂點(diǎn)的集合,」表示弧的集合。A"表示開始結(jié)點(diǎn),F(xiàn)中除了開始結(jié)點(diǎn)r外的其它結(jié)點(diǎn)都可以從r經(jīng)過一步或多步轉(zhuǎn)換到達(dá)。如果從結(jié)點(diǎn)r到結(jié)點(diǎn)v的每一條路徑都經(jīng)過結(jié)點(diǎn)w,則稱結(jié)點(diǎn)w為結(jié)點(diǎn)v的決定結(jié)點(diǎn)。如果/和<是G中的結(jié)點(diǎn),p是^的前驅(qū)決定結(jié)點(diǎn)(predominator)當(dāng)且僅當(dāng)從r到g的每一條路徑都經(jīng)過p。結(jié)點(diǎn)p是結(jié)點(diǎn)《的直接前驅(qū)決定結(jié)點(diǎn)(immediatepredominator)當(dāng)且僅當(dāng)p是^的前驅(qū)決定結(jié)點(diǎn),并且^除了p以外的其他任何前驅(qū)決定結(jié)點(diǎn)也是p的前驅(qū)決定結(jié)點(diǎn)。2斷點(diǎn)類型分類算法下面介紹本發(fā)明用到的算法算法1:LR(k)分析器分析狀態(tài)的SPG構(gòu)造算法算法輸入一個LR(k)文法G=fW,7:f》和它對應(yīng)的LR(k)分析表M.算法輸出每一個分析狀態(tài)對應(yīng)的SPG算法步驟對W中的每一個狀態(tài)w為狀態(tài)m生成一個初始結(jié)點(diǎn)/,對狀態(tài)/中的每一個主要項(xiàng)目/;生成一個結(jié)點(diǎn)AU,并且從結(jié)點(diǎn)/,添加--條弧到W,,如果的形式為^—aJ^,W,這里a.(yVU7T,%er生成一個新的終止結(jié)點(diǎn)M一,,并且從結(jié)點(diǎn)W,",添加--條弧到A^,/"否則,如果wz'的形式為X—>cr,/W,這里"e(WU7〕*生成一個新的終止結(jié)點(diǎn)w,從結(jié)點(diǎn)A;,,添加一條弧到Mw,^—w否則,如果的形式為J—ccX-,W,這里《,/;^(WU7〕*,Xe;V)為形如:Z—(T7/(這里we「WU7T)的每一個項(xiàng)目生成一個新的結(jié)點(diǎn)從結(jié)點(diǎn)Wm,添加一條弧到新生成的每--個結(jié)點(diǎn)把所有新生成的結(jié)點(diǎn)添加到集合^中當(dāng)2不為空從集合g中刪除一個結(jié)點(diǎn),記該結(jié)點(diǎn)為w,re,如果&是跟一個形如7—e,^7的項(xiàng)目關(guān)聯(lián),這里s表示空串生成一個新的終止結(jié)點(diǎn)A^y,"—^,從結(jié)點(diǎn)W^,,添加一條弧到A^^w—^否則,如果Wc—是跟一個形如,,,T7的項(xiàng)目關(guān)聯(lián),這里5er,(7VU7T生成一個新的終止結(jié)點(diǎn)A^,",從結(jié)點(diǎn)/VeOT,添加一條弧到^、一《否則,如果是跟一個形如/77的項(xiàng)目關(guān)聯(lián),這里SfW,"e對每一個形如5-《/77/f這^f7VU7)"的項(xiàng)目生成一個新的結(jié)點(diǎn)從結(jié)點(diǎn)添加一條弧到新生成的每-一個結(jié)點(diǎn)如果把所有新生成的結(jié)點(diǎn)添加到集合2中算法2:斷點(diǎn)位置類型分類算法算法輸入一個LR(k)文法G=fW,7:^S).算法輸出文法G的每一個斷點(diǎn)位置的類型有效斷點(diǎn),無效斷點(diǎn)或者不確定斷點(diǎn)算法步驟(1)使用算法1為分析器的每一個狀態(tài)構(gòu)造一個SPG;(2)對于每一個SPG,計(jì)算直接前驅(qū)決定結(jié)點(diǎn),為該SPG構(gòu)造決定結(jié)點(diǎn)樹(dominatortree)T,前驅(qū)決定結(jié)點(diǎn)的計(jì)算及決定結(jié)點(diǎn)樹的構(gòu)造可以采用既有的決定結(jié)點(diǎn)和決定結(jié)點(diǎn)樹構(gòu)造算法,如2004年Georgiadis等的算法;(3)檢査得到的每一個SPG中的每一個結(jié)點(diǎn),對于每一個形如[7,O]并且能推導(dǎo)出自身的斷點(diǎn)位置標(biāo)記為無效斷點(diǎn)位置;(4)檢査得到的每一個SPG中的每一個結(jié)點(diǎn),如果文法位置",/]尚未做標(biāo)記,并且存在一個部分狀態(tài)(x,力包含文法位置[z./l對應(yīng)的項(xiàng)目,并且結(jié)點(diǎn)((x,力,|—/J])不是(x,力對應(yīng)的終止結(jié)點(diǎn)的前驅(qū)決定結(jié)點(diǎn)(此處(Jc,y)表示一個部分狀態(tài)(partialstate),x表示項(xiàng)目集,Y表示向前看符號集。((x,力,表示SPG中對應(yīng)部分狀態(tài)(x,力的個結(jié)點(diǎn),[/,/]表示文法G中的一個文法位置),則把[Z,./]標(biāo)記為不確定斷點(diǎn)位置。結(jié)點(diǎn)《是結(jié)點(diǎn)p的前驅(qū)決定結(jié)點(diǎn)當(dāng)且僅當(dāng)在步驟(2)中構(gòu)造的決定結(jié)點(diǎn)樹T中《是p的祖先(ancestor);(5)把所有未做標(biāo)記的其它文法位置都標(biāo)記為有效斷點(diǎn)位置。3本發(fā)明提出的斷點(diǎn)調(diào)試方法標(biāo)準(zhǔn)的LR(k)分析方法不支持在產(chǎn)生式中間調(diào)用語義動作,因此如果想在產(chǎn)生式的中間插入斷點(diǎn),就必須在相應(yīng)位置添加無用非終結(jié)符符號。本發(fā)明的文法斷點(diǎn)調(diào)試方法中,調(diào)試器會根據(jù)用戶設(shè)置的斷點(diǎn),自動添加相應(yīng)的無用非終結(jié)符號,這一過程對用戶是透明的,用戶不必手工添加任何的無用非終結(jié)符號。添加無用非終結(jié)符號后可能會引入新的分析沖突,造成更改后的文法不再是LR(k)文法,從而導(dǎo)致分析過程失敗。因此,調(diào)試器還需要利用上面給出的算法2來計(jì)算各個斷點(diǎn)的類型。本發(fā)明提出的斷點(diǎn)調(diào)試方法的具體實(shí)施步驟如下(1)用BNF等定義語言的LR(k)文法或者LR(k)文法的子類文法G;(2)用戶在相應(yīng)的文法位置插入斷點(diǎn);(3)檢査用戶設(shè)置的每一個斷點(diǎn),如果該斷點(diǎn)設(shè)置在某個產(chǎn)生式右部末尾,則什么都不做。如果設(shè)置在產(chǎn)生式右部中間的某個文法位置,則自動添加相應(yīng)的無用非終結(jié)符號。這樣會得到一個新的文法G';(4)為文法G'生成分析表。根據(jù)不同的設(shè)計(jì)需求,分析表可以是LR(k)的,或者LR(k)的子類,如SLR(1),LR(0),LALR(1)等;(5)利用上面給出的算法2來計(jì)算每個斷點(diǎn)的類型,從而可以得到每個斷點(diǎn)是有效斷點(diǎn),無效斷點(diǎn),還是不確定斷點(diǎn);(6)利用LR(k)分析方法(或者其子類分析方法)分析輸入串,直到遇到一個歸約(reduce)動作。檢査該歸約動作處是否對應(yīng)-個斷點(diǎn),如果有斷點(diǎn),則根據(jù)不同的斷點(diǎn)類型采取如下動作(6.1).如果是一個有效斷點(diǎn),則暫停分析過程,以圖形化或其它手段等報告顯示當(dāng)前的分析狀態(tài)信息;(6.2).如果是一個無效斷點(diǎn),則忽略該斷點(diǎn),繼續(xù)分析過程;(6.3).如果是一個不確定斷點(diǎn),可以采用兩種不同的處理策略,一種方法是簡單忽略這些不確定斷點(diǎn),繼續(xù)分析過程。另一種方法是結(jié)合當(dāng)前的輸入串和斷點(diǎn)設(shè)置位置,進(jìn)一步判斷該位置是否有效,如果對于當(dāng)前的輸入串,該位置是有效的,則按照有效斷點(diǎn)位置處理,如果對于當(dāng)前輸入串,該位置是無效的,則忽略該位置,繼續(xù)分析過程。4實(shí)驗(yàn)效果評價實(shí)用的文法調(diào)試器必須有較快的響應(yīng)速度,從第3節(jié)所述步驟可看出,每次更改了斷點(diǎn)設(shè)置,在啟動調(diào)試器前,都必須重新生成分析表,重新構(gòu)造每個狀態(tài)的SPG(算法1),并且重新計(jì)算每個斷點(diǎn)的類型(算法2)。為了驗(yàn)證本發(fā)明提出的調(diào)試方法的有效性,我們進(jìn)行了三組實(shí)驗(yàn),實(shí)驗(yàn)4.1使用了一個指數(shù)規(guī)模的文法以及一個實(shí)用的編程語言文法Java,用于驗(yàn)證LR(k)分析表的生成性能;實(shí)驗(yàn)4.2給出了-一個指數(shù)規(guī)模文法和Java文法的SPG構(gòu)造時間,用于驗(yàn)證SPG的構(gòu)造性能;實(shí)驗(yàn)4.3給出了Java文法的斷點(diǎn)分類時間,用于驗(yàn)證斷點(diǎn)分類算法的性能。4.1LR(k)分析表的生成性能LR(k)分析方法的子類——LALR(l),由于分析表規(guī)模較小,分析速度較快,且與LR(k)分析能力接近,在實(shí)際中應(yīng)用最廣。因此,本實(shí)驗(yàn)中我們也生成LALR(1)分析表。Earley證明了圖11所示文法,它的狀態(tài)數(shù)目隨著n的增大呈指數(shù)規(guī)模增長。Eariey指出該文法很適合驗(yàn)證LR(k)分析表的構(gòu)造性能。表2給出了n=2,3,4,5,6,7,8時的LALR(1)分析表的構(gòu)造時間,表3給出了一個實(shí)用的編程語言文法Java(采用的是Javal.4的文法)的LALR(l)分析表生成時司.<table>tableseeoriginaldocumentpage10</column></row><table>表:表3通常,對于一個典型的編程語言文法,它的LALR(1)分析表一般只有幾百個狀態(tài),即使對于文法異常復(fù)雜的0++文法,它的LALR(1)分析表規(guī)模也只有1200個狀態(tài)左右。因?yàn)長ALR(1)是一個線性時間的分析方法,從表2和表3可以看出,對于一個實(shí)際的編程語言文法,LALR(1)分析表的生成速度是相當(dāng)快的,可以滿足文法調(diào)試的時間響應(yīng)需求。4.2SPG構(gòu)造性能表4給出了圖11所示文法的SPG構(gòu)造時間,表間。<table>tableseeoriginaldocumentpage10</column></row><table>表4表5需要指出的是,我們的SPG構(gòu)造實(shí)現(xiàn)并未做很多的優(yōu)化,如果對程序?qū)崿F(xiàn)做進(jìn)一步的優(yōu)化,構(gòu)造時間還可以進(jìn)一步縮短。從表4和表5可看出,對于一個和Java1.4文法規(guī)模相似的編程語言文法,SPG的構(gòu)造時間是相當(dāng)快的。由于SPG構(gòu)造算法是線性的,實(shí)用的編程語言文法的分析器狀態(tài)數(shù)目一般不會比Javal.4文法高出太多,因此,可以推斷出,SPG的構(gòu)造時間可以滿足文法調(diào)試的時間響應(yīng)需求。4.3斷點(diǎn)位置分類算法的性能在斷點(diǎn)位置分類算法中,有兩個問題比較關(guān)鍵,-一個是,該算法的執(zhí)行速度有多快;另一個是,對于一個典型的文法,有多少文法位置是有效的,有多少是無效的,有多少是不確定的。對于第一個問題,我們使用了Java1.4文法來檢驗(yàn)算法的執(zhí)行時間,表6給出了實(shí)驗(yàn)結(jié)果。<table>tableseeoriginaldocumentpage11</column></row><table>斷點(diǎn)分類算法是一個線性算法,從表6可看出,對于一個規(guī)模和Java類似的文法,斷點(diǎn)分類算法的運(yùn)行時間大約為0.003秒,這個執(zhí)行速度是相當(dāng)快的,可以滿足文法調(diào)試器的需求。對于第二個問題,從表6可以看出,在Java1.4文法中,有效斷點(diǎn)位置的比例為86.47%,無效斷點(diǎn)的比例為4.87%,不確定斷點(diǎn)的比例為8.66%。典型地,在一個產(chǎn)生式的右部一般至少有兩個符號,換句話說,對于一個產(chǎn)生式,一般至少有3個文法位置,使用傳統(tǒng)的文法斷點(diǎn)調(diào)試方法,僅能在產(chǎn)生式右部末尾插入斷點(diǎn),因此,最多有1/3的位置可插入斷點(diǎn),考慮到平均情況下產(chǎn)生式右部的符號數(shù)目一般遠(yuǎn)多于兩個,因此,傳統(tǒng)方法可以利用的斷點(diǎn)位置一般遠(yuǎn)低于1/3,而采用我們的方法,可以顯著增加可利用的斷點(diǎn)數(shù)目。以表6所示Java文法為例,使用傳統(tǒng)斷點(diǎn)調(diào)試方法,最多只有278個斷點(diǎn)可以利用,而使用我們的斷點(diǎn)調(diào)試方法,可以利用的斷點(diǎn)數(shù)目有2326個,是傳統(tǒng)方法可利用斷點(diǎn)數(shù)目的8倍多??紤]到Java文法在編程語言文法中具有相當(dāng)?shù)拇硇?,?jù)此,我們可以推斷出,本發(fā)明的斷點(diǎn)調(diào)試方法,在提高可利用斷點(diǎn)數(shù)目方面是卓有成效的。5結(jié)論本發(fā)明提出的LR(k)文法斷點(diǎn)調(diào)試方法,支持在產(chǎn)生式右部的任意文法位置設(shè)置斷點(diǎn),該方法可以顯著增加可以利用的斷點(diǎn)位置,可以跟蹤到更細(xì)粒度的文法單元。本發(fā)明的方法對用戶完全透明,不會給用戶增加任何處理負(fù)擔(dān),用戶用起來簡單直觀。而且,本發(fā)明很容易集成到現(xiàn)有的分析器生成框架中。斷點(diǎn)類型分類算法可以區(qū)分不同的斷點(diǎn)類型,可以更好的指導(dǎo)分析過程,同時又不會引入任何新的分析沖突。我們的調(diào)試方法,可以幫助用戶更好地調(diào)試文法,可在一定程度上降低分析器的開發(fā)難度。權(quán)利要求1.一種LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法,其特征在于它包括如下步驟(1.1)定義語言的LR(k)文法或者LR(k)文法的子類文法G;(1.2)用戶在相應(yīng)的文法位置插入斷點(diǎn);(1.3)檢查用戶設(shè)置的每一個斷點(diǎn),如果該斷點(diǎn)設(shè)置在某個產(chǎn)生式右部末尾,則什么都不做,如果該斷點(diǎn)設(shè)置在產(chǎn)生式右部中間的某個文法位置,則自動添加相應(yīng)的無用非終結(jié)符號,從而得到一個新的文法G’;(1.4)為新的文法G’生成分析表;(1.5)計(jì)算每個斷點(diǎn)的類型,從而可以得到每個斷點(diǎn)是有效斷點(diǎn)、無效斷點(diǎn),還是不確定斷點(diǎn);(1.6)利用LR(k)分析方法或者其子類分析方法分析輸入串,直到遇到一個歸約動作,檢查該歸約動作處是否對應(yīng)一個斷點(diǎn),如果對應(yīng)一個斷點(diǎn),則根據(jù)不同的斷點(diǎn)類型采取如下動作(1.6.1)如果是一個有效斷點(diǎn),則暫停分析過程,顯示當(dāng)前的分析狀態(tài)信息;(1.6.2)如果是一個無效斷點(diǎn),則忽略該斷點(diǎn),繼續(xù)分析過程;(1.6.3)如果是一個不確定斷點(diǎn),則采用以下兩種方法之一一種方法是簡單忽略這些不確定斷點(diǎn),繼續(xù)分析過程;另一種方法是結(jié)合當(dāng)前的輸入串和斷點(diǎn)設(shè)置位置,進(jìn)一步判斷該位置是否有效,如果對于當(dāng)前的輸入串,該位置是有效的,則按照有效斷點(diǎn)位置處理,如果對于當(dāng)前輸入串,該位置是無效的,則忽略該位置,繼續(xù)分析過程。2.如權(quán)利要求1所述的LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法,其特征在于在所述步驟(1.5)中,采用以下斷點(diǎn)位置類型分類算法來計(jì)算每個斷點(diǎn)的類型算法輸入一個LR(k)文法G=(W7:f"算法輸出文法G的每一個斷點(diǎn)位置的類型有效斷點(diǎn),無效斷點(diǎn)或不確定斷點(diǎn)算法步驟,(2.1)為分析器的每一個狀態(tài)構(gòu)造一個狀態(tài)位置圖(SPG);(2.2)對于每一個SPG,計(jì)算直接前驅(qū)決定結(jié)點(diǎn),為該SPG構(gòu)造決定結(jié)點(diǎn)樹T;(2.3)檢査得到的每一個SPG中的每一個結(jié)點(diǎn),對于每一個形如[/,O]并且能推導(dǎo)出自身的斷點(diǎn)位置標(biāo)記為無效斷點(diǎn)位置;(2.4)檢査得到的每一個SPG中的每一個結(jié)點(diǎn),如果文法位置[i',y]尚未做標(biāo)記,并且存在一個部分狀態(tài)(x,力包含文法位置[/,y]對應(yīng)的項(xiàng)目,并且結(jié)點(diǎn)(Oc,y),[/,_/])不是0c,y)對應(yīng)的終止結(jié)點(diǎn)的前驅(qū)決定結(jié)點(diǎn),則把[z',刀標(biāo)記為不確定斷點(diǎn)位置;(2.5)把所有未做標(biāo)記的其它文法位置都標(biāo)記為有效斷點(diǎn)位置。3.如權(quán)利要求1所述的LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法,其特征在于在所述步驟(l.4)中,為新的文法G'生成的分析表可以是LR(k)的,或者LR(k)的子類。4.如權(quán)利要求2所述的LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法,其特征在于在所述步驟(2.1)中,采用以下SPG構(gòu)造算法來構(gòu)造一個狀態(tài)位置圖算法輸入一個LR(k)文法G=(V,7;AS和它對應(yīng)的LR(k)分析表Af.算法輸出每一個分析狀態(tài)對應(yīng)的SPG算法步驟對A/中的每一個狀態(tài)7K為狀態(tài)ffJ生成一個初始結(jié)點(diǎn)4對狀態(tài)w中的每一個主要項(xiàng)目/m'生成一個結(jié)點(diǎn)AU,并且從結(jié)點(diǎn)添加一條弧到如果加/的形式為/1—ot'XAW,這里a,-e(WU7T,Zer生成一個新的終止結(jié)點(diǎn)M鄉(xiāng),,并且從結(jié)點(diǎn)A^,添加一條弧到W,w,否則,如果脂'的形式為」—cr,/W,這里ae生成一個新的終止結(jié)點(diǎn)M油e一—^,從結(jié)點(diǎn)Wm,添加一條弧到Wrec/uce,M—w否則,如果w/的形式為^—a'Jfyg,似,這里a,/e(iVU7y,Xe^)為形如:卩/]7(這里"e(5VU7T)的每一個項(xiàng)目生成一個新的結(jié)點(diǎn)從結(jié)點(diǎn)添加一條弧到新生成的每一個結(jié)點(diǎn)把所有新生成的結(jié)點(diǎn)添加到集合^中當(dāng)0不為空從集合2中刪除一個結(jié)點(diǎn),記該結(jié)點(diǎn)為W^m,如果Ww是跟一個形如r—lY/7的項(xiàng)目關(guān)聯(lián),這里e表示空串生成一個新的終止結(jié)點(diǎn)A^^^—£j,從結(jié)點(diǎn)Wcw添加一條弧到M^^—£j否則,如果l腦,是跟一個形如r—'%//7的項(xiàng)目關(guān)聯(lián),這里5er,^(WU7)*生成一個新的終止結(jié)點(diǎn),從結(jié)點(diǎn)^ur咖,添加一條弧到W鄉(xiāng)B否則,如果iV^—是跟一個形如y—//7的項(xiàng)目關(guān)聯(lián),這里SeA^e(AOJ7)*對每一個形如:£—^,77"i^至(WU""的項(xiàng)目生成一個新的結(jié)點(diǎn)從結(jié)點(diǎn)M.,re,添加一條弧到新生成的每一個結(jié)點(diǎn)如果把所有新生成的結(jié)點(diǎn)添加到集合g中全文摘要本發(fā)明涉及LR(k)文法任意文法位置的斷點(diǎn)調(diào)試方法,其步驟是定義語言的LR(k)文法或LR(k)文法的子類文法G;在相應(yīng)的文法位置插入斷點(diǎn);檢查每一斷點(diǎn),若該斷點(diǎn)設(shè)置在產(chǎn)生式右部中間的某個文法位置,則添加無用非終結(jié)符號,從而得到新的文法G’;為文法G’生成分析表;計(jì)算每個斷點(diǎn)的類型;分析輸入串,直至遇到一個歸約動作,檢查該歸約動作處是否對應(yīng)一個斷點(diǎn),如是則采取如下動作對有效斷點(diǎn),暫停分析過程,顯示當(dāng)前的分析狀態(tài)信息;對無效斷點(diǎn),忽略該斷點(diǎn),繼續(xù)分析過程;對不確定斷點(diǎn),則忽略或結(jié)合當(dāng)前的輸入串和斷點(diǎn)設(shè)置位置,進(jìn)一步判斷該位置是否有效,如果對于當(dāng)前的輸入串,該位置是有效的,則按有效斷點(diǎn)位置處理,如果該位置是無效的,則忽略該位置,繼續(xù)分析過程。本發(fā)明顯著增加可跟蹤和調(diào)試的斷點(diǎn)數(shù)目,可以跟蹤到更細(xì)粒度的語法成分,幫助用戶更好地進(jìn)行文法調(diào)試,降低分析器的開發(fā)難度。文檔編號G06F9/45GK101149687SQ200610113288公開日2008年3月26日申請日期2006年9月21日優(yōu)先權(quán)日2006年9月21日發(fā)明者超劉,虎李,福許,金茂忠申請人:北京航空航天大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
大关县| 合江县| 永平县| 大余县| 营山县| 定安县| 周口市| 湘潭市| 博野县| 济宁市| 务川| 泰和县| 武川县| 柏乡县| 乌兰浩特市| 土默特左旗| 德兴市| 泰宁县| 开封县| 慈溪市| 睢宁县| 普格县| 东山县| 宣汉县| 南涧| 泸西县| 祁阳县| 宁陕县| 惠水县| 芒康县| 钟祥市| 荔浦县| 卓尼县| 阿克| 班戈县| 全南县| 丹凤县| 江华| 诏安县| 牡丹江市| 庆阳市|