亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        編譯原理中處理語法錯誤問題的研究

        2007-01-01 00:00:00
        計算機(jī)教育 2007年5期

        摘要:本文分析了編譯系統(tǒng)以及其錯誤處理能力對于程序設(shè)計語言的重要性,對其中處理語法錯誤問題進(jìn)行了深入研究,并從語法錯誤的診察與報告,到利用遞歸下降分析法對錯誤進(jìn)行恢復(fù)和糾正處理,直至最后的限制重復(fù)報告錯誤信息及其中涉及的關(guān)鍵技術(shù)進(jìn)行了介紹,從而幫助學(xué)習(xí)者和開發(fā)者牢固掌握相關(guān)的理論和技術(shù)。

        關(guān)鍵詞:編譯系統(tǒng);語法錯誤處理;遞歸下降分析法

        中圖分類號:G642.41 文獻(xiàn)標(biāo)識碼:B

        文章編號:1672-5913(2007)06-0040-03

        1 前言

        在計算機(jī)應(yīng)用領(lǐng)域,目前多數(shù)用戶都是通過高級語言實現(xiàn)所需要的計算。而對于任何高級語言來說,其編譯系統(tǒng)內(nèi)容豐富,具有嚴(yán)密的邏輯性,對提高學(xué)習(xí)者和開發(fā)者的計算機(jī)軟件素質(zhì)具有很大作用,使其不但能認(rèn)識計算機(jī)信息處理的實質(zhì),還可以綜合運用所學(xué)的軟件設(shè)計技術(shù)來分析解決問題[1]。因此,編譯系統(tǒng)是計算機(jī)系統(tǒng)軟件最重要的組成部分之一,也是用戶最直接關(guān)心的工具之一,它不但要接受程序語言的所有標(biāo)準(zhǔn)定義,以便源代碼實現(xiàn)跨平臺的可移植性,還必須生成高效、正確的目標(biāo)代碼。因此編譯系統(tǒng)本身是一個大而復(fù)雜的程序,值得我們深入分析研究。

        我們知道,在編譯原理的學(xué)習(xí)和編譯系統(tǒng)的構(gòu)建過程中,語法分析是其中最為重要的一個組成部分。而在實際的編譯系統(tǒng)中,語法分析器的錯誤處理能力與其構(gòu)造原理和技術(shù)一樣重要,這通常是編譯原理教學(xué)環(huán)節(jié)中容易忽視的地方,不利于學(xué)習(xí)者進(jìn)行實際的編譯系統(tǒng)的開發(fā)工作。因此,本文對C++編譯系統(tǒng)中遞歸下降的語法分析過程進(jìn)行了研究,找到了發(fā)現(xiàn)并糾正語法錯誤問題的有效方法。

        2 語法錯誤

        編程人員在編寫程序時,很難一次就將程序?qū)懙耐昝罒o誤,尤其是一些比較復(fù)雜的程序,往往會存在程序錯誤。程序錯誤的種類有很多,比如違反語言的語法和語義規(guī)定的錯誤,源程序超出了計算機(jī)系統(tǒng)的某種限制而引發(fā)的錯誤,等等。其中語法錯誤是指源程序中含有不符合語法規(guī)則的成分時所產(chǎn)生的錯誤,一般是有關(guān)語言結(jié)構(gòu)上的錯誤,如單詞拼寫錯、表達(dá)式中缺少操作數(shù)、begin和end不匹配等。

        語法分析結(jié)果的質(zhì)量將直接影響到編譯系統(tǒng)后期各階段的工作,因此,為了幫助編程人員發(fā)現(xiàn)并糾正這一階段可能出現(xiàn)的錯誤,編譯系統(tǒng)的語法分析器應(yīng)該具有錯誤處理的能力,其不但可以對語法上正確的源程序進(jìn)行正確的編譯,同時還能夠?qū)τ绣e誤的源程序報錯,甚至在一定程度上對錯誤進(jìn)行改正[2]。當(dāng)然,進(jìn)行出錯處理是件很麻煩的事,想象一個設(shè)計良好的編譯調(diào)試環(huán)境,比如Visual Studio,我們在用它開發(fā)編譯程序時,不光可以知道哪一句錯了,而且可以獲得出錯的原因。

        3 語法錯誤處理技術(shù)

        3.1 錯誤的診察與報告

        語法錯誤可以采用系統(tǒng)的方式解決,不依賴于出現(xiàn)的上下文。這些錯誤比較容易發(fā)現(xiàn),通常出現(xiàn)在表1所示的翻譯代碼error中。

        表1分析函數(shù)翻譯代碼

        這里,編譯系統(tǒng)使用EBNF文法描述語言,為每個非終結(jié)符計算FIRST集合和FOLLOW集合,編寫分析函數(shù)將非終結(jié)符的每個產(chǎn)生式翻譯成可執(zhí)行代碼。翻譯的規(guī)則可由文法產(chǎn)生式的可能形式導(dǎo)出。對每一種產(chǎn)生式形式α,用T(α)表示α的翻譯代碼,全局變量t表示從詞法分析器讀入的當(dāng)前單詞,調(diào)用函數(shù)gettok可以獲取下一個輸入單詞,此外,

        當(dāng)然,表1的代碼也可用其他代碼序列表示,以解決有時會出現(xiàn)的代碼冗長問題。

        編譯系統(tǒng)在查找到源程序中的語法錯誤后,要對這些錯誤進(jìn)行報告,報告的主要內(nèi)容是錯誤發(fā)生的位置以及錯誤的性質(zhì)。有了這兩點內(nèi)容,編程人員就可以比較方便地確定錯誤的性質(zhì)并對其進(jìn)行改正。文本所采用的錯誤報告方式為:每發(fā)現(xiàn)一處錯誤,就把該錯誤信息打印出來,包括源程序的名字、錯誤所在行、錯誤的具體內(nèi)容等,同時用箭頭指向出錯的位置。例如,對于程序段:

        for (i=0; i<100, i++)

        cout>>i

        其中的錯誤,編譯系統(tǒng)將報告如下錯誤信息:

        Test.cpp: 15: missing ';' before ')'

        location: class PrintTest

        for (i=0; i<100, i++)

        ^

        Test.cpp: 16: missing ';'

        location: class PrintTest

        cout>>i

        ^

        2 errors

        其中,“Test.cpp”是上述程序段所在的C++源程序的名字,后面的“15”是錯誤所在的行的號碼,“missing ';' before ')'”表示具體的錯誤信息,下面的“l(fā)ocation”指錯誤在PrintTest類中,接下來該信息還顯示了源程序中含有錯誤的代碼行,并用箭頭“^”指向出錯位置,最后指出錯誤的總數(shù),這里是2個。

        3.2 遞歸下降分析法中的錯誤糾正策略

        語法錯誤不難發(fā)現(xiàn),但要修正錯誤并非易事。當(dāng)然,不能說一發(fā)現(xiàn)錯誤就停止分析,這樣做顯然不合理,錯誤處理的大部分工作用于對錯誤進(jìn)行適當(dāng)?shù)奶幚怼e誤恢復(fù),以便系統(tǒng)分析過程可以繼續(xù)下去。

        語法錯誤的恢復(fù)方法是通過對輸入程序添加遺漏的單詞或忽略某些單詞,從而將錯誤的輸入轉(zhuǎn)換為合法的句子。遺憾的是,找到合適的恢復(fù)方法非常困難,因為編程人員的意圖有時候是很難推斷出來的,這種推測在一定程度上增加了編譯系統(tǒng)的復(fù)雜程度,如果選擇錯誤將導(dǎo)致分析程序混亂,甚至導(dǎo)致后面本來文法上正確的輸入也產(chǎn)生大量的語法錯誤。

        而對于遞歸下降分析器的結(jié)構(gòu)而言,有助于選取合適的錯誤恢復(fù)策略。分析器由許多函數(shù)組成,每個函數(shù)只完成分析任務(wù)的一小部分,因此,目標(biāo)被劃分成若干個子目標(biāo),每個子目標(biāo)調(diào)用相關(guān)的分析函數(shù)。具體而言,假設(shè)構(gòu)造了一個非終結(jié)符X的分析函數(shù)X,如果下一個輸入單詞不屬于非終結(jié)符X的FOLLOW集合,函數(shù)就略過它,反復(fù)執(zhí)行直至遇到X的FOLLOW集合中的單詞,在處理完屬于FOLLOW(X)的單詞后,要將所有合法的部分返回給函數(shù)X的調(diào)用者。但這樣做也有不完善之處,它不能處理含有非終結(jié)符X的句型。例如,非終結(jié)符X出現(xiàn)在句型αXβ中,函數(shù)X會略過D(β)中的元素,由于D(β)通常比FOLLOW(X)小,當(dāng)分析識別出一個屬于FOLLOW(X),但不屬于D(β)的輸入單詞時,程序丟棄該單詞,X停止繼續(xù)執(zhí)行。因此,如果D(β)已知,函數(shù)必須使用D(β),否則使用FOLLOW(X),實現(xiàn)方法如下面error.cpp中的輸出函數(shù)所示。比如,當(dāng)分析函數(shù)分析for語句的第三個表達(dá)式時,函數(shù)就利用了集合{ ; ) }恢復(fù)表達(dá)式存在的語法錯誤。

        <error.cpp exported functions>≡

        extern void test ARGS((int tok,char set[]));

        該函數(shù)檢查下一個單詞是否等于tok,如果不等,則發(fā)出提示信息,并跳過當(dāng)前單詞,反復(fù)執(zhí)行直至遇到一個屬于{tok}∪set的單詞。set集合包含了所有不能忽略的元素,保證輸入不會無限地忽略。

        <error.cpp functions>≡

        viod test(tok,set) int tok;char set[];{

        if(t==tok)

        t=gettok();

        else{

        expect(tok);

        skipto(tok,set);

        if(t==tok)

        t=gettok();

        函數(shù)test調(diào)用函數(shù)expect報錯,調(diào)用函數(shù)skipto跳過錯誤的單詞。skipto定義如下:

        <error.cpp exported functions>+≡

        extern void skipto ARGS((int tok,char set[]));

        skipto不斷跳過輸入單詞,直至遇到單詞t(t要么與tok相等,要么使得kind[t]包含在無效終結(jié)符數(shù)組set中)。kind[t]是一個單詞編碼,它意味著一個含有t的集合。例如,編碼ID表示集合FIRST(expression),kind[t]與ID相等。利用數(shù)組{ID,0}作為函數(shù)skipto的第二個參數(shù),指示函數(shù)跳過若干個無關(guān)的單詞直至找到一個屬于FIRST(expression)的元素。表2概括了所有的kind值。

        對于表中未提及的單詞,kind[t]就等于t??傊?,如果t與tok相等,或者t屬于kind[t],那么skipto將不會跳過任何單詞。

        表2數(shù)組kind的值

        3.3 限制重復(fù)報告錯誤信息

        當(dāng)我們在編寫程序時,有些錯誤會不止一次地出現(xiàn),比如語句的最后忘記寫“;”,實際上這種錯誤沒有必要重復(fù)報告,這就要求語法分析具有制止重復(fù)報告錯誤信息的功能。我們設(shè)計了一張出錯名字表,一旦發(fā)現(xiàn)一個出錯名字后,先查出錯名字表,查找有無同名且同性質(zhì)的出錯名字,如果有,則不再報告此錯誤,否則將此出錯名字添加進(jìn)名字表并顯示出錯信息。

        4 總結(jié)

        錯誤處理能力是衡量編譯器性能的重要方面,本文列舉了一些編譯系統(tǒng)在實際應(yīng)用中的案例,說明了系統(tǒng)的錯誤處理能力體現(xiàn)在編譯過程的各個環(huán)節(jié),不可忽視。系統(tǒng)的錯誤處理能力在幫助編程人員盡快修改程序方面起到了非常重要的作用,是編譯系統(tǒng)的一個重要組成部分。因此,我們應(yīng)盡量地把它設(shè)計完善,方便用戶的使用。

        參考文獻(xiàn):

        [1] 黃賢英,劉貞,劉全利. “編譯原理”課程的地位及教改思路[J].重慶科技學(xué)院學(xué)報(社會科學(xué)版),2005,(3):

        103-105.

        [2] 王雷,劉志成,等. 編譯原理課程設(shè)計[M]. 北京:機(jī)械工業(yè)出版社,2005.

        收稿日期:2006-09-01

        作者簡介:劉慧(1978-),女,講師,博士研究生,主講課程為編譯原理、信息檢索,主要研究方向為Web信息挖掘與檢索、知識發(fā)現(xiàn)。

        色偷偷av亚洲男人的天堂| 久久精品亚洲熟女av蜜謦| 五月丁香六月综合缴清无码| 无遮挡又黄又刺激又爽的视频| 人妻无码中文专区久久综合 | 国产成人激情视频在线观看| 精品在线视频在线视频在线视频 | 国产久热精品无码激情| 国产乱人伦真实精品视频| 国产少妇露脸精品自拍网站| 无码精品国产一区二区三区免费| 亚洲日韩成人av无码网站| 一本久道久久综合五月丁香| 国产精品久久婷婷六月| 国产av无码专区亚洲av麻豆| 亚洲精品字幕| 亚洲h电影| 国产区一区二区三区性色| 人妻 偷拍 无码 中文字幕| av无码久久久久久不卡网站| 18禁国产美女白浆在线| 少妇高潮精品在线观看| 无码成人一区二区| 欧美在线观看一区二区| 午夜在线观看一区二区三区四区| 亚洲国产精品无码成人片久久| 国产高颜值大学生情侣酒店| 被欺辱的高贵人妻被中出| 少妇熟女天堂网av天堂| 久久伊人精品一区二区三区| 五十路熟妇亲子交尾| 美女黄网站永久免费观看网站| 亚洲国产精品一区二区成人av| 欧洲女人性开放免费网站| 国产在线观看黄| 黑丝美腿国产在线观看| 亚洲中文字幕无码中文字| a级毛片免费观看视频 | 一区二区在线观看精品在线观看| 国产综合无码一区二区辣椒| 精品人妻无码中文字幕在线|