專利名稱:一種應(yīng)用于高速數(shù)字io波形引擎的編譯器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于軟件編譯算法領(lǐng)域,特別涉及一種應(yīng)用于高速數(shù)字IO波形引擎的小型編譯器。
背景技術(shù):
在傳統(tǒng)意義上,儀器廠商為用戶提供控制程序或者驅(qū)動程序都以函數(shù)和屬性為單位,這些函數(shù)和屬性都偏重于實現(xiàn)某一項或幾項特定功能,用戶僅可固定使用廠商提供的控制方式而不能將更底層的功能按照自己的需求任意組合,這樣就對用戶的使用方式做出了限制,無法滿足用戶更高層次的需求。例如,用戶需要使用高速數(shù)字IO模塊提供的原有函數(shù)實現(xiàn)多個波形帶有多個marker標記,同時滿足多個觸發(fā)條件,還要實現(xiàn)N層循環(huán)嵌套和條件分支,這幾乎是不可能實現(xiàn)的。本申請人于2011年12月20日提出了一項專利申請“一種用于任意波形產(chǎn)生系統(tǒng)的處理器”(申請?zhí)枮?01110430689. 8),該申請?zhí)峁┝艘环N精簡指令集的高速數(shù)字IO波形引擎,該引擎只采用Generate、Repeat/end Repeat、If/endIf、Wait、Clear這幾條簡單的指令即可覆蓋波形引擎的絕大部分功能需求。在采用上述精簡指令集進行程序代碼編寫完成后,需要對程序代碼進行編譯,從而轉(zhuǎn)化為二進制目標碼。一般編譯過程分為詞法分析,語法分析,語法制導(dǎo)翻譯,中間碼生成,存儲管理,代碼優(yōu)化和目標代碼生成過程。而且由于編譯器比較復(fù)雜,因此編譯過程通常是在上位機上完成的,編譯完成后將目標碼下載到下位機運行。傳統(tǒng)編譯方法所面臨的問題1、執(zhí)行這些步驟的過程中,會生成堆棧,鏈表,二叉樹等結(jié)構(gòu)變量,需要大量內(nèi)存空間來存儲這些變量,這些資源大多需要預(yù)先申請,用戶編寫代碼過長過短都會造成空間浪費。2、需要通過上位機完成程序編譯之后才能通過總線發(fā)送到下位機執(zhí)行,是因為上述過程對速度和空間的要求較高,下位機一般無法提供上述步驟所需要的足夠的資源完成編譯過程。3、傳統(tǒng)編譯過程的環(huán)節(jié)比較多,且是順序執(zhí)行的關(guān)系,下一個步驟的輸入依賴于上一個步驟的輸出,如果上一個步驟的結(jié)果不符合語法定義的規(guī)則,下一個步驟將不能正常執(zhí)行,這時候環(huán)境將會停止編譯并報錯返回。這樣繁冗的操作是為了整個IDE環(huán)境的穩(wěn)定,但是對于用戶來講相當于增加了諸多的限制,而且越往后面的步驟報錯之后用戶越是無法干預(yù),甚至迷惑不解。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明提供了一種應(yīng)用于高速數(shù)字IO波形引擎的小型編譯器,能夠簡化編譯過程,減小編譯器大小,在編譯過程中使用資源可靈活申請,不會浪費,且該編譯器能夠設(shè)置在下位機中,免去了上位機編譯下載過程,減少開銷和調(diào)試時間。為了解決上述技術(shù)問題,本發(fā)明是這樣實現(xiàn)的
一種應(yīng)用于高速數(shù)字IO波形引擎的小型編譯器,該編譯器包括第一模塊、第二模塊和第二模塊;第一模塊,用于關(guān)鍵字和變量的識別及分類處理;具體為讀取待編譯程序,進行逐字處理;如果當前讀取到的為關(guān)鍵字,則按照預(yù)先設(shè)定的關(guān)鍵字使用規(guī)則,先對關(guān)鍵字的前后詞句進行檢查,看其是否符合語法定義;如果不符合,則停止編譯并返回相應(yīng)錯誤碼;如果符合,則將當前關(guān)鍵字對應(yīng)的出現(xiàn)次數(shù)變量加1,并且在順序鏈表LO的尾部增加一個結(jié)點,將當前關(guān)鍵字的代碼添加到尾部結(jié)點中;如果當前關(guān)鍵字具有參數(shù),則將參數(shù)記錄到第一參數(shù)數(shù)組,并在當前關(guān)鍵字的鏈表結(jié)點中記錄 參數(shù)在第一參數(shù)數(shù)組中的索引;如果當前讀取到的為特殊符號,包括begin、end、小括號、大括號、雙引號、分號,則將當前特殊符號對應(yīng)的出現(xiàn)次數(shù)變量加1,并且在順序鏈表LO的尾部增加一個結(jié)點,將當前特殊符號的代碼添加到尾部結(jié)點中;第二模塊,用于語法檢查和代碼優(yōu)化;具體為所述語法檢查包括檢驗關(guān)鍵字和特殊符號對應(yīng)的出現(xiàn)次數(shù)變量的值是否與順序鏈表LO中相應(yīng)關(guān)鍵字和特殊符號出現(xiàn)次數(shù)相同;根據(jù)順序鏈表LO中具有配對關(guān)系的特殊符號的出現(xiàn)次數(shù)和位置檢驗配對關(guān)系是否正常;如果語法檢查有錯誤,則停止編譯并返回相應(yīng)錯誤碼;所述代碼優(yōu)化為將所述第一參數(shù)數(shù)組中的元素轉(zhuǎn)化為參數(shù)鏈表中的結(jié)點,采用參數(shù)鏈表結(jié)點地址代替順序鏈表LO中的第一參數(shù)數(shù)組索引;釋放第一參數(shù)數(shù)組空間;第三模塊,用于實現(xiàn)目標代碼生成;具體為逐個訪問順序鏈表LO中的每個結(jié)點,如果當前結(jié)點為關(guān)鍵字且沒有參數(shù),則直接根據(jù)目標碼生成規(guī)則生成目標碼,如果當前結(jié)點為關(guān)鍵字且有參數(shù),則根據(jù)結(jié)點中記錄的參數(shù)鏈表結(jié)點地址,從參數(shù)鏈表中提取參數(shù),將關(guān)鍵字與參數(shù)組合后根據(jù)目標碼生成規(guī)則生成目標碼;如果當前結(jié)點為特殊符號,則直接根據(jù)目標碼生成規(guī)則生成目標碼。優(yōu)選地,所述第一模塊進一步用于,如果關(guān)鍵字跟隨的參數(shù)為trigger n,則只將η的值存儲到第二參數(shù)數(shù)組中;步驟三目標代碼生成時,如果當前結(jié)點為關(guān)鍵字且參數(shù)η從第二參數(shù)數(shù)組中提取,則為提取的η加上trigger的前綴,然后再生成目標碼。有益效果1、本發(fā)明采用鏈表形式記錄關(guān)鍵字,并且將變量的記錄形式也轉(zhuǎn)化為鏈表,這樣可以靈活申請空間,減少編譯過程中的空間利用。編譯過程中會根據(jù)變量長度靈活申請空間并及時釋放,生成的堆棧長度隨結(jié)構(gòu)增減,最大化減少編譯過程中空間的申請。2、本發(fā)明的編譯器所用資源較少,用戶可將寫好的代碼放入下位機直接進行編譯執(zhí)行,免去上位機編譯下載過程,減少硬件開銷和調(diào)試時間。因此本發(fā)明可應(yīng)用于板載S0C,免去交叉編譯過程。3、本發(fā)明將原有的7項過程統(tǒng)編為2個階段,提高編譯效率,降低過程之間依賴性,檢查報錯功能融入到整個過程,可準確定位錯誤。
圖1為本發(fā)明流程圖。
圖2為順序鏈表和參數(shù)數(shù)組的示意圖。
具體實施例方式下面結(jié)合附圖并舉實施例,對本發(fā)明進行詳細描述。本發(fā)明提供了一種高速數(shù)字IO波形引擎的小型編譯器,其包括三個模塊,第一模塊、第二模塊和第三模塊分別執(zhí)行如下步驟一、二、三。圖1是本發(fā)明流程圖。步驟一、第一模塊進行關(guān)鍵字和變量的識別及分類處理。如圖1所示,用戶代碼作為輸入數(shù)據(jù)進入編譯器,編譯器會對代碼進行預(yù)編譯處理,這一階段主要是檢查語法錯誤,關(guān)鍵字識別,簡單的存儲等,為后續(xù)過程做準備,如果有錯誤會返回相應(yīng)的十六位錯誤碼,對照提供的文檔可查出對應(yīng)的錯誤。具體執(zhí)行過程如下步驟11、讀取待編譯程序,進行逐字處理;如果當前讀取到的為關(guān)鍵字,則執(zhí)行步驟12 ;如果當前讀取到的為特殊符號,包括begin、end、小括號、大括號、雙引號、分號,則執(zhí)行步驟13。其中,讀取待編譯程序的方式可以為參數(shù)方式和文件方式。文件方式是指用戶已經(jīng)編輯好的外部文件,使用的時候調(diào)用使用文件讀取的函數(shù)將文件內(nèi)容讀入;參數(shù)方式是指將編輯好的程序保存在庫文件中,通過在庫文件中打開函數(shù)的參數(shù)形式引入待編譯程序。讀入過程使用簡單的C語言函數(shù)即可實現(xiàn)。為節(jié)省整個編譯過程的執(zhí)行時間,在讀入文件的時候,編譯器會同時進行關(guān)鍵字和特殊符號的識別并進行分類處理。關(guān)鍵字為高速數(shù)字IO波形引擎中精簡指令集中的指令,包括 Generate, Repeat/end Repeat、If/else/end If, Wait, Clear。特殊符號包括begin、end、小括號、大括號、雙引號、分號(作為一條語句的結(jié)束符,用法同C語言)。步驟12、按照預(yù)先設(shè)定的關(guān)鍵字使用規(guī)則,先對關(guān)鍵字的前后詞句進行檢查,看其是否符合語法定義;如果不符合,則停止編譯并返回相應(yīng)錯誤碼;如果符合,則將當前關(guān)鍵字對應(yīng)的出現(xiàn)次數(shù)變量加1,并且在順序鏈表LO的尾部增加一個結(jié)點,將當前關(guān)鍵字的代碼添加到尾部結(jié)點中;如果當前關(guān)鍵字具有參數(shù),該參數(shù)可以為變量,可以為常量,則將參數(shù)的信息記錄到參數(shù)數(shù)組,并在當前關(guān)鍵字的鏈表結(jié)點中記錄參數(shù)在參數(shù)數(shù)組中的索引;當然,鏈表結(jié)點中還會有下一個節(jié)點的指向信息。以下面這段代碼為例,第一個詞為Generate,是關(guān)鍵字,檢查該關(guān)鍵字后面是否為波形名,如果不是,則返回錯誤代碼例如22,如果是,則將該關(guān)鍵字的代碼0411添加在如圖2所示的順序鏈表LO的第一個結(jié)點中,并且將Generate對應(yīng)的次數(shù)變量G加1,而且,Generate具有參數(shù)wave I,則將該wave I存儲到參數(shù)數(shù)組的第一個元素中,將該元素的索引記錄到順序鏈表LO的第一個結(jié)點。對于Repeat 10,與Generate wavel類似,只是存儲在參數(shù)數(shù)組中的不是變量名,而是10。對于“end r印eat”和“end if”,會認為其屬于關(guān)鍵字,按照沒有參數(shù)的關(guān)鍵字進行處理。在實際實現(xiàn)中,編譯器在遇到end時會檢查其后續(xù)單詞,如果是需要配對的關(guān)鍵字,如“end repeat, end if”這兩個單詞,會將“endrepeat”、“end if”作為一個整體關(guān)鍵字進行處理,其他end均會按照特殊符號處理。Generate wavel Repea! 10
WavcformB End Repeat Clear Tigge.rO Walt 100 Ifll^erO
Generate waveformC1
Else
Generaic wavefonnD End if本步驟一的過程只提供簡單的語法檢查功能,并不能發(fā)現(xiàn)深層次的語法和邏輯錯誤,如檢查括號是否配對等。這個過程相當于把傳統(tǒng)編譯過程的詞法分析,語法分析,語法制導(dǎo)翻譯和存儲管理的部分功能結(jié)合為一個過程,簡化中間處理,在處理數(shù)據(jù)的過程中進代碼檢查,提高編譯效率。步驟二、第二模塊進行語法檢查和代碼優(yōu)化。第二階段去除了傳統(tǒng)編譯過程的中間代碼生成階段,結(jié)合語法檢查和代碼優(yōu)化直接進行目標代碼生成,如果有錯誤出現(xiàn)則返回相應(yīng)錯誤碼。具體為所述語法檢查包括檢驗關(guān)鍵字和特殊符號對應(yīng)的出現(xiàn)次數(shù)變量的值是否與順序鏈表LO中相應(yīng)關(guān)鍵字和特殊符號出現(xiàn)次數(shù)相同;根據(jù)順序鏈表LO中具有配對關(guān)系的特殊符號的出現(xiàn)次數(shù)和位置檢驗配對關(guān)系是否正常,包括beginend的配對關(guān)系、{}的配對,()的配對等;如果語法檢查有錯誤,則停止編譯并返回相應(yīng)錯誤碼。所述代碼優(yōu)化為將所述參數(shù)數(shù)組中的元素轉(zhuǎn)化為參數(shù)鏈表中的結(jié)點,采用參數(shù)鏈表結(jié)點地址代替順序鏈表LO中的參數(shù)變量索引,釋放參數(shù)數(shù)組空間,從而實現(xiàn)壓縮空間存儲。由于編譯前不知道程序中有多少個變量,也不知道變量長度,因此需要預(yù)先申請比較大的數(shù)組,本發(fā)明在第二階段中,將數(shù)組轉(zhuǎn)化為鏈表,并釋放數(shù)組空間,從而實現(xiàn)了空間壓縮。步驟三、第三模塊實現(xiàn)目標代碼生成;逐個訪問順序鏈表LO中的每個結(jié)點,如果當前結(jié)點為關(guān)鍵字且沒有參數(shù),則直接根據(jù)目標碼生成規(guī)則生成目標碼,如果當前結(jié)點為關(guān)鍵字且有參數(shù),則根據(jù)結(jié)點中記錄的參數(shù)鏈表結(jié)點地址,從參數(shù)鏈表中提取參數(shù),將關(guān)鍵字與參數(shù)組合后根據(jù)目標碼生成規(guī)則生成目標碼;如果當前結(jié)點為特殊符號,則直接根據(jù)目標碼生成規(guī)則生成目標碼。至此,本流程結(jié)束。為了進一步節(jié)省存儲空間,在步驟12中,如果關(guān)鍵字跟隨的變量為trigger n,則只將η的值存儲到第二參數(shù)數(shù)組中;步驟三目標代碼生成時,如果當前結(jié)點為關(guān)鍵字且參數(shù)η從第二參數(shù)數(shù)組中提取,則為提取的η加上trigger的前綴,然后再生成目標碼。前面步驟中所述的參數(shù)數(shù)組與這里的第二參數(shù)數(shù)組是兩個數(shù)組,通過數(shù)組名可以實現(xiàn)區(qū)分。綜上所述,以上僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。
凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1.一種應(yīng)用于高速數(shù)字IO波形引擎的小型編譯器,其特征在于,該編譯器包括第一模塊、第二模塊和第三模塊; 第一模塊,用于關(guān)鍵字和變量的識別及分類處理;具體為 讀取待編譯程序,進行逐字處理; 如果當前讀取到的為關(guān)鍵字,則按照預(yù)先設(shè)定的關(guān)鍵字使用規(guī)則,先對關(guān)鍵字的前后詞句進行檢查,看其是否符合語法定義;如果不符合,則停止編譯并返回相應(yīng)錯誤碼;如果符合,則將當前關(guān)鍵字對應(yīng)的出現(xiàn)次數(shù)變量加1,并且在順序鏈表LO的尾部增加一個結(jié)點,將當前關(guān)鍵字的代碼添加到尾部結(jié)點中;如果當前關(guān)鍵字具有參數(shù),則將參數(shù)記錄到第一參數(shù)數(shù)組,并在當前關(guān)鍵字的鏈表結(jié)點中記錄參數(shù)在第一參數(shù)數(shù)組中的索引; 如果當前讀取到的為特殊符號,包括begin、end、小括號、大括號、雙引號、分號,則將當前特殊符號對應(yīng)的出現(xiàn)次數(shù)變量加1,并且在順序鏈表LO的尾部增加一個結(jié)點,將當前特殊符號的代碼添加到尾部結(jié)點中; 第二模塊,用于語法檢查和代碼優(yōu)化;具體為 所述語法檢查包括檢驗關(guān)鍵字和特殊符號對應(yīng)的出現(xiàn)次數(shù)變量的值是否與順序鏈表LO中相應(yīng)關(guān)鍵字和特殊符號出現(xiàn)次數(shù)相同;根據(jù)順序鏈表LO中具有配對關(guān)系的特殊符號的出現(xiàn)次數(shù)和位置檢驗配對關(guān)系是否正常;如果語法檢查有錯誤,則停止編譯并返回相應(yīng)錯誤碼; 所述代碼優(yōu)化為將所述第一參數(shù)數(shù)組中的元素轉(zhuǎn)化為參數(shù)鏈表中的結(jié)點,采用參數(shù)鏈表結(jié)點地址代替順序鏈表LO中的第一參數(shù)數(shù)組索引;釋放第一參數(shù)數(shù)組空間; 第三模塊,用于實現(xiàn)目標代碼生成;具體為 逐個訪問順序鏈表LO中的每個結(jié)點,如果當前結(jié)點為關(guān)鍵字且沒有參數(shù),則直接根據(jù)目標碼生成規(guī)則生成目標碼,如果當前結(jié)點為關(guān)鍵字且有參數(shù),則根據(jù)結(jié)點中記錄的參數(shù)鏈表結(jié)點地址,從參數(shù)鏈表中提取參數(shù),將關(guān)鍵字與參數(shù)組合后根據(jù)目標碼生成規(guī)則生成目標碼;如果當前結(jié)點為特殊符號,則直接根據(jù)目標碼生成規(guī)則生成目標碼。
2.如權(quán)利要求1所述的編譯器,其特征在于,所述第一模塊進一步用于,如果關(guān)鍵字跟隨的參數(shù)為trigger n,則只將η的值存儲到第二參數(shù)數(shù)組中;步驟三目標代碼生成時,如果當前結(jié)點為關(guān)鍵字且參數(shù)η從第二參數(shù)數(shù)組中提取,則為提取的η加上trigger的前綴,然后再生成目標碼。
全文摘要
本發(fā)明公開了一種應(yīng)用于高速數(shù)字IO波形引擎的小型編譯器,其處理分為三步,關(guān)鍵字和變量的識別及分類處理,語法檢查和代碼優(yōu)化,目標代碼生成。在第一步中,采用鏈表的形式記錄關(guān)鍵字和特殊符號的出現(xiàn)順序,關(guān)鍵字的參數(shù)記錄在數(shù)組中,第二步將數(shù)組轉(zhuǎn)換為鏈表,減小空間占用;最后一步根據(jù)鏈表出棧,生成目標碼。本發(fā)明能夠簡化編譯過程,減小編譯器大小,在編譯過程中使用資源可靈活申請,不會浪費,且該編譯器能夠設(shè)置在下位機中,免去了上位機編譯下載過程,減少開銷和調(diào)試時間。
文檔編號G06F9/45GK103019801SQ201210560608
公開日2013年4月3日 申請日期2012年12月20日 優(yōu)先權(quán)日2012年12月20日
發(fā)明者王凱, 王石記, 劉金川, 史浩, 辛麗霞 申請人:北京航天測控技術(shù)有限公司