本發(fā)明屬于編譯器處理領(lǐng)域,具體涉及一種iec61131文本編程語言的語法樹表示方法。
背景技術(shù):
當(dāng)前c/c++/java等語言對應(yīng)的編譯器開發(fā)技術(shù)已經(jīng)成熟,上述語言均可基于gcc實現(xiàn)不同處理器的目標(biāo)文件形成。在工業(yè)控制中,iec61131是通用的標(biāo)準(zhǔn),定義了結(jié)構(gòu)化文本st、指令表il的文本型編程語言,是工控領(lǐng)域的安全子集語言,有對應(yīng)的語法和文法定義。通用的編譯器例如gcc并不支持工控專用的語言編譯。可基于flex+bison實現(xiàn)61131文本語言的詞法和語法分析,并形成語法樹,之后開發(fā)語義分析和后端指令輸出模塊。這其中語法樹是非常重要的數(shù)據(jù)結(jié)構(gòu),語法樹是語法分析階段形成的內(nèi)存數(shù)據(jù)結(jié)構(gòu),當(dāng)源程序代碼量大時,語法樹也非常龐大,直接基于內(nèi)存的斷點調(diào)試獲取多級層次結(jié)構(gòu)存在不直觀、不透明的障礙。已有的語法樹中間表示方法,是形成平層化的文本內(nèi)容,用文本編輯器或excel打開查看,通過縮進來表示層次關(guān)系,當(dāng)語法樹層級關(guān)系深或節(jié)點多時,依然存在不夠清晰、無法折疊展開的問題。需要一種能等價表示層次語法樹的方法,以提高編譯器開發(fā)過程中問題診斷和分析的效率,本案由此產(chǎn)生。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的,在于提供一種語法樹層次化表示方法,其可提高調(diào)試和問題診斷效率,并解決平層化文本表示大型語法樹不夠直觀、無法折疊展開的問題。
為了達(dá)成上述目的,本發(fā)明的解決方案是:
一種語法樹層次化表示方法,包括如下步驟:
步驟1,獲取語法樹輸出選項,創(chuàng)建xml文件;
步驟2,基于深度優(yōu)先遍歷語法樹,每個語法樹節(jié)點對應(yīng)一個xml文件節(jié)點,語法樹節(jié)點對應(yīng)的類名作為xml節(jié)點名稱,按照語法樹的父子、兄弟關(guān)系創(chuàng)建xml文件的節(jié)點結(jié)構(gòu);
步驟3,確定并輸出語法樹節(jié)點的信息:輸出各種節(jié)點類型對應(yīng)的數(shù)據(jù)屬性,按照屬性名、屬性值輸出到xml對應(yīng)的節(jié)點中,并輸出該節(jié)點對應(yīng)的源文件名、所在起始行號、起始列號、終止行號、終止列號;
步驟4,存儲語法樹對應(yīng)的xml文件。
上述步驟1中,針對iec61131-3標(biāo)準(zhǔn)的結(jié)構(gòu)化文本st語言、指令表il語言,為各種類型的節(jié)點設(shè)計對應(yīng)的類。
上述步驟1中,針對iec61131-3標(biāo)準(zhǔn)的結(jié)構(gòu)化文本st語言、指令表il語言,支持以配置、資源、任務(wù)、程序組織單元、函數(shù)、功能塊為組織單位,創(chuàng)建若干xml文件。
上述步驟3中,對于函數(shù)類型,輸出函數(shù)名、形參列表信息;對于語句類型,輸出語句關(guān)鍵字、表達(dá)式信息;對于簡單類型變量聲明,輸出變量類型、變量名字;對于復(fù)合結(jié)構(gòu)體類型變量聲明,輸出結(jié)構(gòu)體類型、名稱、各個子成員變量類型和名稱信息。
上述步驟4后,還包括如下步驟:讀取語法樹對應(yīng)的xml文件,并繪制語法樹的樹形結(jié)構(gòu),單擊/雙擊語法樹的節(jié)點時,根據(jù)記錄的文件名和行、列號信息,直接打開源文件,并加亮顯示對應(yīng)的字符區(qū)域。
采用上述方案后,本發(fā)明具有如下有益效果:
本發(fā)明提供了一種將語法樹的內(nèi)存結(jié)構(gòu)等價轉(zhuǎn)換為xml文件的表示方法,便于多人并行開發(fā)時,脫機查看和診斷。基于xml文件,可使用xml查看軟件,對于大型語法樹可分層打開和折疊。人機軟件可讀取xml文件,重構(gòu)語法樹,雙擊語法樹,可關(guān)聯(lián)打開源文件和顯示對應(yīng)的內(nèi)容,實現(xiàn)中間語法樹和源代碼的雙向追溯,提高了編譯器開發(fā)和測試的效率。
附圖說明
圖1是本發(fā)明中語法樹層次化表示原理圖;
圖2語法樹的部分?jǐn)?shù)據(jù)類名定義示例;
圖3是本發(fā)明中語法樹對應(yīng)xml內(nèi)容示例。
具體實施方式
以下將結(jié)合附圖,對本發(fā)明的技術(shù)方案進行詳細(xì)說明。
如圖1所示,本發(fā)明提供一種基于iec61131語言編譯器的可視化語法樹層次化表示方法,包括如下步驟:
步驟1,獲取語法樹輸出選項,創(chuàng)建xml文件;
首先,形成語法樹:為形成抽象語法樹,針對iec61131-3標(biāo)準(zhǔn)的結(jié)構(gòu)化文本st語言、指令表il語言,為各種類型的節(jié)點設(shè)計對應(yīng)的類,底層的類結(jié)構(gòu)如圖2所示,csymbol是基類,clist類是管理鏈表類,可派生出函數(shù)參數(shù)、語句鏈等具體類,ctoken類是具有屬性的終結(jié)符的基類,例如標(biāo)志符、常量等。基于flex進行詞法分析,形成詞法單元序列。基于bison進行語法分析,形成內(nèi)存的語法樹結(jié)構(gòu)。
其次,獲取語法樹輸出選項,根據(jù)選項創(chuàng)建若干xml文件:支持以iec61131-3定義的配置、資源、任務(wù)、程序組織單元、函數(shù)、功能塊等層次化節(jié)點輸出若干分立的xml文件和總的xml文件。優(yōu)選地,-all表示將語法樹輸出一個總的xml文件。-config表示按照配置為單位輸出xml文件,-resource表示按照資源為單位輸出xml文件,-task表示按照任務(wù)為單位輸出xml文件,-pou表示按照程序組織單元輸出xml文件。-fb表示各個函數(shù)、功能塊的定義單獨輸出xml文件。通過上述選項的組合,可將大型樹形結(jié)構(gòu)拆分為多個xml文件。
步驟2,基于深度優(yōu)先遍歷語法樹,每個語法樹節(jié)點對應(yīng)一個xml文件節(jié)點,語法樹節(jié)點對應(yīng)的類名作為xml節(jié)點名稱,按照語法樹的父子、兄弟關(guān)系創(chuàng)建xml文件的節(jié)點結(jié)構(gòu)。例如頂層根節(jié)點類名為clib,則xml的首層節(jié)點為<clib>。
步驟3,確定并輸出語法樹節(jié)點的信息:輸出各種節(jié)點類型對應(yīng)的數(shù)據(jù)屬性,按照屬性名、屬性值輸出到xml對應(yīng)的節(jié)點中,并輸出該節(jié)點對應(yīng)的源文件名、所在起始行號、起始列號、終止行號、終止列號等信息,其中,對于函數(shù)類型,輸出函數(shù)名、形參列表信息。對于語句類型,輸出語句關(guān)鍵字、表達(dá)式信息。對于簡單類型變量聲明,輸出變量類型、變量名字。對于復(fù)合結(jié)構(gòu)體類型變量聲明,輸出結(jié)構(gòu)體類型、名稱、各個子成員變量類型和名稱信息。例如功能塊類型包括函數(shù)名、輸入輸出變量、本地變量、語句等屬性和子節(jié)點內(nèi)容。
存儲語法樹對應(yīng)的xml文件,圖3是一個語法樹對應(yīng)的xml文件片段示例。
步驟4,存儲語法樹對應(yīng)的xml文件。
在完成步驟1至步驟4后,可讀取語法樹對應(yīng)的xml文件,可讀取語法樹對應(yīng)的若干xml文件并展示,使用qt的model-view機制,使用qlisttree形成語法樹的樹形結(jié)構(gòu),單擊/雙擊語法樹的節(jié)點時,根據(jù)記錄的文件名和行、列號信息,可直接打開源文件,并加亮顯示對應(yīng)的字符區(qū)域。
綜合上述,本發(fā)明一種語法樹層次化表示方法。采用深度優(yōu)先遍歷算法遍歷語法樹,將語法樹轉(zhuǎn)換為層次化的xml文件。語法樹根節(jié)點作為xml文件的頂層節(jié)點,以語法樹節(jié)點的類名作為xml的節(jié)點名,輸出該節(jié)點的相關(guān)屬性。將內(nèi)存數(shù)據(jù)的中間語法樹輸出為直觀可視的xml文件,提高了調(diào)試和問題診斷效率,并解決了平層化文本表示大型語法樹不夠直觀、無法折疊展開的問題。
以上實施例僅為說明本發(fā)明的技術(shù)思想,不能以此限定本發(fā)明的保護范圍,凡是按照本發(fā)明提出的技術(shù)思想,在技術(shù)方案基礎(chǔ)上所做的任何改動,均落入本發(fā)明保護范圍之內(nèi)。