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

用于可擴(kuò)展宏語言的方法和系統(tǒng)的制作方法

文檔序號:6419190閱讀:147來源:國知局
專利名稱:用于可擴(kuò)展宏語言的方法和系統(tǒng)的制作方法
本專利申請要求題為“建模工具系統(tǒng)及方法”、于1998年10月16日提交的美國專利申請No.60/104,682的權(quán)益。
本專利申請涉及到共同待審的美國專利申請No.__(代理人卷號#22074661-25531),該申請題為“用于確定兩個(gè)或多個(gè)模型之間差異的方法”且與本申請相同的日期提交,并且被整體引入本文以作為參考。
本專利申請涉及到共同待審的美國專利申請No.__(代理人卷號#22074661-25532),該申請題為“用于模型效果分析的方法”且與本申請?jiān)谙嗤娜掌谔峤?,并且被整體引入本文以作為參考。
本專利申請涉及到共同待審的美國專利申請No.__(代理人卷號#22074661-25534),該申請題為“用于通過SQL輸入對分級數(shù)據(jù)存儲進(jìn)行訪問的方法及裝置”且與本申請?jiān)谙嗤娜掌谔峤唬⑶冶徽w引入本文以作為參考。
本專利申請涉及到共同待審的美國專利申請No.__(代理人卷號#22074661-25535),該申請題為“用于建模工具的裝置及方法”且與本申請?jiān)谙嗤娜掌谔峤唬⑶冶徽w引入本文以作為參考。
本發(fā)明一般涉及計(jì)算機(jī)語言處理程序。具體來說,它涉及到一種可擴(kuò)展宏語言。
宏是一個(gè)命令集,它可被運(yùn)行以執(zhí)行一給定的任務(wù)。這些任務(wù)的例子包括在字處理程序中插入常用的名稱和地址,或者執(zhí)行一系列的鍵盤敲擊以生成一個(gè)文件。用宏來執(zhí)行的任務(wù)一般都是重復(fù)性的任務(wù),因而在實(shí)質(zhì)上就可以通過執(zhí)行宏來代替人工地重復(fù)命令,從而節(jié)省大量時(shí)間。
近年來,各種不同的應(yīng)用程序都允許用戶在允許范圍的限制內(nèi)(即,在特定的應(yīng)用限制之內(nèi))編寫宏和腳本。例如,字處理程序一般都允許用戶通過對一系列的鍵盤敲擊進(jìn)行錄制,以創(chuàng)建一個(gè)宏并在以后重新播放。其它的應(yīng)用程序也允許用戶創(chuàng)建宏以在應(yīng)用軟件限制范圍之內(nèi)對數(shù)據(jù)進(jìn)行檢索和操縱。因此,這些應(yīng)用程序都包括一套受限制的宏,例如,用于記錄鍵盤敲擊的宏、用于檢索數(shù)據(jù)的宏。而用戶一般也被限制成只能使用由應(yīng)用程序所提供的宏。
但是,每個(gè)使用應(yīng)用程序的用戶通常都有獨(dú)特的一套指令或命令,用戶希望在應(yīng)用程序中將這些命令或指令作為以前未被提供的宏。由于這些宏一般都是被硬編碼進(jìn)入應(yīng)用程序或是應(yīng)用程序內(nèi)的宏語言中的,所以目前將額外的宏引入應(yīng)用程序的唯一有效的方法就是通過在一個(gè)新的宏可被使用之前修改源代碼并對其進(jìn)行重新編譯,從而將這個(gè)新的宏硬編碼進(jìn)此應(yīng)用程序中。但是,這種方法通常會帶來問題,因?yàn)橛脩粑幢皇谟柽M(jìn)入宏語言或應(yīng)用程序的源代碼來進(jìn)行修改的權(quán)利。另外,對程序開發(fā)員來說,試圖通過定制應(yīng)用程序以引入每個(gè)用戶所希望使用的宏來迎合每個(gè)用戶的喜好將是沉重的負(fù)擔(dān)。
因此,非常需要有一種能夠允許用戶通過修改和擴(kuò)展語言以在使用宏語言時(shí)引入他們的喜好的可擴(kuò)展宏語言。另外,還極為需要使用戶能夠?qū)赀M(jìn)行擴(kuò)展而無需修改或進(jìn)入宏語言的源代碼,因?yàn)樵创a被視為一種知識產(chǎn)權(quán),它是不對用戶公開的。
為了解決現(xiàn)有技術(shù)所述宏語言處理程序中的上述問題,本發(fā)明提供了一種可擴(kuò)展宏語言,它允許用戶通過編寫新的宏命令以引入滿足用戶特定需求的過程,而且無需修改任何宏語言處理程序的源代碼。這種可擴(kuò)展宏語言能夠通過對該語言所未知的新的宏命令進(jìn)行識別并將新宏命令與保存在注冊表(即,一個(gè)儲存庫)中的過程調(diào)用相關(guān)聯(lián)起來,從而實(shí)現(xiàn)宏語言的動態(tài)擴(kuò)充。
本發(fā)明中還提供了一種用于將新宏命令動態(tài)注冊進(jìn)注冊表的機(jī)制,從而實(shí)現(xiàn)了可擴(kuò)展性。為了注冊新的宏命令,用戶可以在注冊表中輸入代表此新宏命令的關(guān)鍵字及相關(guān)代碼或過程,以用于通過可擴(kuò)展宏語言來執(zhí)行它。
本發(fā)明還為可擴(kuò)展宏語言定義出了一種簡單的語法,以用于對新宏命令的識別,而且無需知道它們所執(zhí)行的功能是什么。
根據(jù)本發(fā)明的目的,提供了一種語法分析程序和宏管理程序(macro handler),以用于處理先前未在宏語言中定義的宏命令。宏語言中先前未定義或從未定義的宏命令指的是那些在發(fā)布和提供給用戶時(shí)未被引入宏語言的有效命令集的宏命令。語法分析程序?qū)暾Z言表達(dá)式中的關(guān)鍵字進(jìn)行分析,并識別出一個(gè)或多個(gè)代表先前未在宏語言中定義的宏命令的關(guān)鍵字。宏管理程序接收宏表達(dá)式中的關(guān)鍵字,并在關(guān)鍵字注冊表中對與該關(guān)鍵字相關(guān)的可執(zhí)行代碼進(jìn)行檢索。運(yùn)行可執(zhí)行代碼以處理由該關(guān)鍵字所代表的宏命令。關(guān)鍵字注冊表可被擴(kuò)充以引入任何用于擴(kuò)充宏語言關(guān)鍵字極其相關(guān)代碼。
以下將參考附圖對本發(fā)明的其它特征和優(yōu)點(diǎn)以及本發(fā)明各種實(shí)施例的結(jié)構(gòu)和操作進(jìn)行詳細(xì)說明。在附圖中,相同的參考標(biāo)號代表了相同或功能類似的單元。
現(xiàn)在將參考附圖用例子對本發(fā)明的優(yōu)選實(shí)施例進(jìn)行說明。


圖1的框圖顯示了根據(jù)本發(fā)明的可擴(kuò)展宏語言的各個(gè)組成部分;圖2顯示了一個(gè)含有迭代因子宏的宏表達(dá)式的例子。
本發(fā)明的目的是提供一種能在實(shí)時(shí)環(huán)境下被動態(tài)擴(kuò)展且無需重建和重新編譯宏語言的可擴(kuò)展宏語言。雖然這種可擴(kuò)展宏語言可能已含有一個(gè)預(yù)定的宏命令集,但本發(fā)明允許用戶添加所需的額外的或新的宏命令。圖1中的框圖100顯示了用于提供本發(fā)明的可擴(kuò)展宏語言的系統(tǒng)的各個(gè)組成部分。語法分析程序102含有一個(gè)用來對一給定表達(dá)式進(jìn)行分析和語法分析的文法或語法104。如圖1所示,語法分析程序102接收到一個(gè)宏語言表達(dá)式106,并根據(jù)該宏語言的語法104將此表達(dá)式分成多個(gè)部分。以下將對本發(fā)明一個(gè)實(shí)施例中所使用的語法進(jìn)行更加詳細(xì)的說明。參考圖1,語法分析程序102讀取表達(dá)式106,并且識別出語法中預(yù)先定義的、表示一個(gè)新宏命令存在的特定標(biāo)記。在該例中,當(dāng)語法分析程序102在表達(dá)式106中遇到圓括號時(shí),語法分析程序102將把此括號內(nèi)所包含的關(guān)鍵字(例如,“property(name)”)視為一個(gè)新的宏命令。另外,語法分析程序102根據(jù)語法104而識別出括號內(nèi)所包含的“name”是此新宏命令的一個(gè)參數(shù)。語法104的其它方面可以將任何符號之外的字符串規(guī)定解釋為是一個(gè)文字串。這樣,語法分析程序102就在108處將表達(dá)式中的各個(gè)單元分割成如圖所示的多個(gè)部分。本發(fā)明中的語法分析程序102具有一個(gè)新穎的特征,即,該語法分析程序102對標(biāo)記(即,圓括號)中的實(shí)際內(nèi)容來說是透明的。也就是說,只要有新的宏命令或關(guān)鍵字被包含進(jìn)一個(gè)可識別的標(biāo)記之內(nèi),語法分析程序102就能夠?qū)⒋岁P(guān)鍵字分成多個(gè)部分,而無論此關(guān)鍵字是否已在宏語言中得到預(yù)先定義。這樣,如圖中的108所示,宏表達(dá)式106就被根據(jù)可擴(kuò)展宏語言的語法104而劃分成多個(gè)部分。新的關(guān)鍵字“property”被劃分為標(biāo)記部分108a;括號內(nèi)的字符串“name”被劃分為參數(shù)部分108b;字符串“l(fā)ikes”被劃分為文字部分108c;而且字符串“pizza”也被劃分為文字部分108d。
如圖1所示,本發(fā)明還含有一個(gè)宏管理程序110以及一個(gè)含有多個(gè)關(guān)鍵字及其相應(yīng)可執(zhí)行代碼的儲存庫112??蓤?zhí)行代碼可被保存在儲存庫112中以作為一個(gè)對實(shí)際代碼114執(zhí)行時(shí)的指示字。儲存庫112含有一個(gè)或多個(gè)關(guān)鍵字及相關(guān)代碼,并且可被動態(tài)修改,例如,根據(jù)宏語言用戶的需要添加新的關(guān)鍵字和代碼。本發(fā)明中的儲存庫112可以是一個(gè)帶有關(guān)鍵字及相關(guān)代碼的簡單文件。另外,也可采用一個(gè)單獨(dú)的數(shù)據(jù)庫來作為儲存庫112。
當(dāng)宏表達(dá)式被語法分析程序102按語法分析而分割成多個(gè)單獨(dú)部分之后,這些部分將被送至宏管理程序110以進(jìn)行額外處理。對具有關(guān)鍵字“property”108a的標(biāo)記部分來說,宏管理程序110將對儲存庫中的關(guān)鍵字“property”進(jìn)行檢查。如果找到,則與關(guān)鍵字“property”相關(guān)的代碼將被檢索和執(zhí)行。在代碼的執(zhí)行過程中,宏管理程序110將對宏表達(dá)式中所找到的并被語法分析為參數(shù)的全部參數(shù)進(jìn)行掃描以執(zhí)行代碼。宏管理程序110并不需要知道可能在代碼內(nèi)部執(zhí)行的任何其它處理。所有需要宏管理程序110識別的就是“property”是一個(gè)要在儲存庫112中被搜尋的、用于其對應(yīng)代碼的關(guān)鍵字,以及儲存庫112中待被用任何參數(shù)執(zhí)行的特定相應(yīng)代碼。對應(yīng)代碼一般都在儲存庫112中被指定作為一個(gè)指向?qū)嶋H代碼本身114的指示字。
當(dāng)正確執(zhí)行儲存庫中所指定的代碼114之后,宏管理程序110將接受被執(zhí)行代碼的一個(gè)或多個(gè)輸出(如果有的話),并將此輸出放回至宏表達(dá)式的關(guān)鍵字位置中。這樣,在圖1所示的例子中,與帶有參數(shù)“name”的“property”相關(guān)的代碼的輸出可能是MARY。因此,圖中106處的可擴(kuò)展宏表達(dá)式“{property(name)}likes pizza”的結(jié)果就變成圖中116處所示的“Mary likes pizza”。
本發(fā)明一個(gè)新穎的特征在于,與語法分析程序相類似,宏管理程序不需要知道代碼中的任何東西或者由該可執(zhí)行代碼所實(shí)現(xiàn)的功能的類型。宏管理程序只需引入與關(guān)鍵字相關(guān)的可執(zhí)行代碼。在本發(fā)明的一個(gè)示范實(shí)施例中,它允許用戶精確地定義出代碼應(yīng)干什么以及關(guān)鍵字將要執(zhí)行什么命令,從而給用戶提供了一種靈活且可擴(kuò)展的宏語言。
在上述例子中,輸出Mary可以通過各種對宏語言透明的方式而獲得。例如,可以通過從全球網(wǎng)進(jìn)行搜索以獲取姓名Mary,或者也可通過利用查詢語言而從一數(shù)據(jù)庫中獲取它,這進(jìn)一步顯示出了本發(fā)明所提供的可擴(kuò)展性。語言語法現(xiàn)在將對可擴(kuò)展宏語言的一個(gè)實(shí)施例中所使用的語法或文法進(jìn)行詳細(xì)說明。根據(jù)本發(fā)明所述的可擴(kuò)展宏語言含有一個(gè)語法(圖1中的104),該語法由文字、宏、注釋以及運(yùn)算符/作用域字符組成。文字本實(shí)施例中的語法將圓括號之外的所有文本都當(dāng)作文字,而且這些文字與鍵入的完全一樣。在圓括號內(nèi),雙引號中的文本也被作為文字。這種方案允許在宏調(diào)用內(nèi)置入一些文字。以下顯示了文字的一些實(shí)例This text would be emitted just like this;(該文本將被象下面這樣發(fā)出){“So would this text”}宏宏包括對宏處理程序(macro processor)的指令,諸如編程語言中的過程或函數(shù)。根據(jù)本發(fā)明中所定義的語法,所有的宏都被包含在圓括號之內(nèi)。在一個(gè)實(shí)施例中,宏被分為兩類過程宏和迭代因子宏。
過程宏被設(shè)計(jì)用來執(zhí)行一些工作。它們可擴(kuò)充成一個(gè)數(shù)值;它們可說明一個(gè)變量;它們可調(diào)用一個(gè)過程。其執(zhí)行的操作由宏的設(shè)計(jì)者整體指定。但是,在一個(gè)實(shí)施例中,當(dāng)成功完成任務(wù)之后,宏必須返回一個(gè)“真”值,在任務(wù)失敗時(shí),宏必須返回一個(gè)“錯(cuò)誤”值。
以下的表達(dá)式中顯示了一串文字,其后跟隨有一個(gè)用于在打印時(shí)獲取一個(gè)頁號的宏調(diào)用My Model Report-Page{HeaderPage} 輸入My Model Report-Page 1輸出在上述例子中,HeaderPage(首頁)是一個(gè)由用戶定義的用于提取一個(gè)頁號的宏。
迭代因子宏允許用戶啟遍歷(traverse across)數(shù)據(jù)結(jié)構(gòu)。迭代因子由關(guān)鍵字“begin”和“end”區(qū)分,它們用于界定跟隨在迭代因子說明之后的代碼塊?!癰egin/end”塊內(nèi)的代碼每次迭代被執(zhí)行一次。當(dāng)?shù)蜃右驯闅v其庫(poo1)中所有的對象時(shí),控制將斷開迭代塊并且繼續(xù)執(zhí)行迭代塊之后的宏表達(dá)式中的語句。
下列宏表達(dá)式塊顯示了迭代因子宏的一個(gè)應(yīng)用<pre listing-type="program-listing"><![CDATA[{MyIterator  begin   DoSomething  end  }]]></pre>在上述例子中,過程宏“DoSomething”對每個(gè)由“MyIterator”宏返回的單元執(zhí)行一次。包圍整個(gè)段落的圓括號說明了應(yīng)將該括號內(nèi)的所有表達(dá)式都當(dāng)作宏代碼來處理。參數(shù)本發(fā)明所述可擴(kuò)展宏語言中定義的語法允許過程和迭代因子都可接受和處理參數(shù)。參數(shù)可包括字符串或其它宏。為了區(qū)分參數(shù),參數(shù)被包含于跟隨在宏之后的括號內(nèi)。宏可以接受所需的可變長度參數(shù)列表。下面顯示了一個(gè)含有參數(shù)“foo”的宏表達(dá)式{Macro With Parameters(“foo”)}控制塊在一些情況下,如果宏表達(dá)式的任何部分出現(xiàn)錯(cuò)誤,則想要使整個(gè)宏表達(dá)式都出現(xiàn)錯(cuò)誤。下面的例子就顯示出了這樣一種情況{FirstName[MiddleInitial“.”]LastName}如果沒有middle initial(中間首字母),則MiddleInitial宏將返回一個(gè)空值或一個(gè)錯(cuò)誤值。在這種情況下,文字“.”就不應(yīng)被打印出來。為了適應(yīng)這種情況,本發(fā)明的語法中包括了一對方括號(“[]”),它們代表一個(gè)條件表達(dá)式。因此,如果方括號內(nèi)的宏失效,則方括號內(nèi)剩余的表達(dá)式部分都不會被顯示出。在上述例子中,如果MiddleInitial因?yàn)槿鄙贁?shù)值而失效,則文字“.”將不被打印出來。
條件塊具有內(nèi)部范圍,即,條件塊的故障不會影響到周邊的代碼。為了使塊中的條件影響到外部的塊,語法還需額外包括一種所謂的傳播條件,該條件由尖括號來表示。如果一對尖括號內(nèi)的任何宏出現(xiàn)錯(cuò)誤,則尖括號內(nèi)的塊以及相鄰的外部塊都會失效。下面的例子顯示了帶有條件和傳播條件的宏表達(dá)式{Print“”[Print[Fail]]}輸入foo foo 輸出{Print“”[Print&lt;Fail&gt;]}輸入foo 輸出在上兩個(gè)例子中,“Print”宏都輸出字“foo”。第一個(gè)例子中,方括號內(nèi)的失效宏被包含在其塊中。因此,下一個(gè)具有“Print”的外部塊會像第一個(gè)“Print”一樣得到執(zhí)行,結(jié)果就輸出了“foo foo”。在第二個(gè)例子中,當(dāng)尖括號內(nèi)的宏失效時(shí),故障會被傳播給下一個(gè)具有“Print”的外部塊。因此,下一個(gè)具有“Print”的外部塊就不會被執(zhí)行。由于打印宏被包含在一對方括號內(nèi),故障就只限于該塊之內(nèi)。這樣,第一個(gè)“Print”宏就得到執(zhí)行,結(jié)果輸出了“foo”。
圖2顯示了根據(jù)本發(fā)明所述含有一個(gè)迭代因子宏的宏表達(dá)式的一個(gè)例子。如參考圖1所述的那樣,關(guān)鍵字“ForEach”被語法分析程序102(圖1)識別為一個(gè)宏,而字“Employee”則被識別為是宏“ForEach”的一個(gè)參數(shù)。當(dāng)宏管理程序接收到標(biāo)記關(guān)鍵字“ForEach”時(shí),宏管理程序110(圖1)將在注冊表112中搜索此關(guān)鍵字“ForEach”,并且執(zhí)行相應(yīng)的代碼?!癋orEach”宏的代碼可包括(例如)在具有指定參數(shù)“employee”類型的給定對象204的全部子對象204b、204c的宏表達(dá)式的begin/end塊內(nèi)執(zhí)行命令以進(jìn)行搜索的指令。在該宏表達(dá)式202中,還有另一個(gè)宏存在于begin/end塊之內(nèi)。因此,宏管理程序110(圖1)在注冊表112內(nèi)執(zhí)行對關(guān)鍵字“Property”的搜索,并且為具有“ForEach”關(guān)鍵字所指定的employee類型的各個(gè)子對象204b、204c執(zhí)行相應(yīng)的代碼搜索。與關(guān)鍵字“Property”相關(guān)的代碼可以包括(例如)打印在關(guān)鍵字“Property”的參數(shù)中所指定的類型數(shù)值的指令,在這種情況下,employee的姓名由“EmpName”指定。因此,宏表達(dá)式202的結(jié)果就是在圖中的208處輸出“Mary John”。
根據(jù)本發(fā)明所述的可擴(kuò)展宏語言在定制宏以具體滿足個(gè)別用戶的需求方面是非常有用的。例如,這種可擴(kuò)展宏語言已經(jīng)與UMA模型接合,以用于從UMA模型中根據(jù)用戶的需求來檢索各種對象。UMA在共同待審的美國專利申請No.__(代理人卷號#22074661-25535)中公開,該申請題為“用于建模工具的裝置和方法”,于1999年10月15日提交,它被整體引入以作為本發(fā)明的參考。附錄A中含有對在UMA模型中使用本發(fā)明所述可擴(kuò)展宏語言的簡要說明,并被稱為UMA模板語言。附錄A中的說明只解釋了可擴(kuò)展宏語言的一個(gè)實(shí)施例,而且附錄中的說明不應(yīng)被看作是對這種可擴(kuò)展宏語言的范圍和能力的限制。
盡管以特定的形式顯示了本發(fā)明并且對其的說明是根據(jù)其實(shí)施例來進(jìn)行的,但是,本領(lǐng)域技術(shù)人員應(yīng)該理解,在不脫離本發(fā)明的精神和范圍的情況下,可以對其作出上述和其它形式及細(xì)節(jié)的改變。概覽本文的目的是為UMA中所使用的模板語言提供一個(gè)簡單的介紹。它假設(shè)讀者已具有UMA的對象/特性元模型的工作知識。
本文的意圖不在于為結(jié)構(gòu)提供詳盡的說明。UMA組成員可以提供這種說明,而且他們能夠給出許多使用本工具的代碼樣本。
UMA模板語言(UTL)的目的是為任何基于UMA的應(yīng)用程序提供描述能力。這些能力可被用于各種特征,包括(但不僅限于此)·宏擴(kuò)充在模型基礎(chǔ)上對代碼模板的實(shí)時(shí)擴(kuò)充。其實(shí)例包括OR-Compass中的觸發(fā)代碼和存儲過程,以及SQL-Compass中的VisualBasic和Java組件。
·腳本說明在模型基礎(chǔ)上執(zhí)行一系列的命令。其一個(gè)實(shí)例為OR-Compass中用于Forward Engineering的控制程序代碼。
UTL結(jié)構(gòu)的目的是增強(qiáng)其在基于UMA的產(chǎn)品中的使用能力。它是通過允許在剪裁語言以滿足用戶對產(chǎn)品的特定需求中給用戶1提供最大程度的靈活性,同時(shí)提供盡可能多的應(yīng)用支持并展現(xiàn)出允許重復(fù)使用新應(yīng)用代碼的機(jī)制。
為了實(shí)現(xiàn)這些目標(biāo),UTL1·為語言定義一個(gè)最小語法;2·允許用戶編寫過程和迭代因子;3·提供一個(gè)機(jī)制以用于將過程和迭代因子注冊入注冊表。語法小結(jié)以下是UTL語法的小結(jié),其目的是為理解應(yīng)用程序而提供最小程度的需要。更多的信息可在隨OR-Compass 1.0一起發(fā)布的文檔中找到。
模板代碼由文字、宏、注釋以及一些運(yùn)算符/作用域字符組成。當(dāng)前,UTL將所有代碼都看作符號串?dāng)?shù)字值由它們的串表示來描述;大部分宏都對符號串進(jìn)行估算。等等2。
1本文中,“用戶”指的是UMA應(yīng)用程序的開發(fā)者,而不是應(yīng)用程序的終端用戶。
2預(yù)期在今年秋天發(fā)布的UTL 1.5也將支持操作的數(shù)字模式,而且它可在處理這些數(shù)字時(shí)提供更好的性能。這會對諸如容量計(jì)算的性能帶來好處。文字在模板源代碼中,圓括號之外的所有文本都當(dāng)作文字,而且這些文字與鍵入的完全一樣。在圓括號內(nèi),雙引號中的文本也被作為文字。前者允許輸入大塊的樣板,例如一個(gè)保存過程的主體。后者允許在宏調(diào)用中置入文字。例子This text would be emitted just like this;(該文本將象這樣發(fā)出){“So would this text”}宏宏是發(fā)給宏處理程序…基本過程的特殊指令。所有的宏都被包含在圓括號之內(nèi)。宏基本上被分為兩類過程宏和迭代因子宏。
過程宏被設(shè)計(jì)用來執(zhí)行一些工作。它們可擴(kuò)展為一個(gè)數(shù)值;它們可說明一個(gè)變量;它們可調(diào)用一個(gè)過程。其執(zhí)行的操作由宏的設(shè)計(jì)者整體指定。它們所受的唯一限制就是它們必須在成功完成任務(wù)之后返回一個(gè)“真”值,在任務(wù)失敗時(shí)返回一個(gè)“錯(cuò)誤”值。
下面顯示了一串文字,其后跟隨有一個(gè)用于在打印時(shí)獲取一個(gè)頁號的宏調(diào)用My Model Report-Page{HeaderPage} 輸入My Model Report-Page 1 輸出迭代因子宏允許用戶橫遍歷數(shù)據(jù)結(jié)構(gòu)。迭代因子由關(guān)鍵字“begin”和“end”區(qū)分,它們用于分界跟隨在迭代因子說明之后的代碼塊?!癰egin/end”塊內(nèi)的代碼每次迭代被執(zhí)行一次。當(dāng)?shù)蜃右驯闅v其庫(pool)中所有的對象時(shí),控制將斷開迭代塊并且繼續(xù)執(zhí)行宏表達(dá)式中迭代塊之后的第一個(gè)語句。
例子—以下為每個(gè)由MyIterator宏返回的單元執(zhí)行一次過程宏DoSomething。包圍整個(gè)代碼段落…的圓括號表明其中的全部代碼都應(yīng)被視為宏代碼。
<pre listing-type="program-listing"><![CDATA[{MyIterator  begin   DoSomething(進(jìn)行一些處理)  end  }]]></pre>過程宏和迭代因子宏都可接受參數(shù)。參數(shù)是符號串或任何被視為符號串的東西,例如另一個(gè)宏。如果一個(gè)宏使用了參數(shù),參數(shù)將被包含在宏后面的括號中。由于不需要宏的向前聲明,所以宏可以接受變量長度參數(shù)列表(如果需要的話)。例子{Macro With Parameters(“foo”)}控制塊在一些情況下,如果宏表達(dá)式的任何部分出現(xiàn)錯(cuò)誤,則需要使整個(gè)宏表達(dá)式都出現(xiàn)錯(cuò)誤。一個(gè)例子就是一些其后跟隨了一個(gè)可選數(shù)值的樣板文本;如果該數(shù)值未被提供,則樣板將不被顯示出來。
方括號中的任何代碼都是條件代碼如果其任何一部分出現(xiàn)錯(cuò)誤,則整體都會出錯(cuò)。“故障”意味著宏將不能執(zhí)行而且文字也不會被顯示出來。
例子—如果沒有中間姓,則.將不會被顯示{FirstName[MiddleInitial“.”]LastName}條件塊隱藏了它們的內(nèi)部范圍。這意味著條件塊的故障不會影響到周邊代碼。尖括號內(nèi)的任何代碼都是傳播條件代碼如果尖括號內(nèi)的任何部分出現(xiàn)錯(cuò)誤,則它將失敗并且把故障向外傳播給下一個(gè)塊。
區(qū)分這兩種類型塊的最好辦法是用舉例說明。在以下兩個(gè)例子中,打印宏都打出字“foo”,而出故障的宏則都出現(xiàn)了故障。條件塊的例子{Print“”[Print[fail]]} 輸入foo foo 輸出傳播條件塊的例子{Print“”[Print&lt;fail&gt;]} 輸入foo 輸出結(jié)構(gòu)LWMDataButlerUTL的所需能力是利用稱為數(shù)據(jù)管理器(butler)的對象來實(shí)現(xiàn)的。數(shù)據(jù)管理器在執(zhí)行模板代碼時(shí)負(fù)責(zé)為宏處理程序遇到的宏提供實(shí)現(xiàn)。當(dāng)宏處理程序被調(diào)用時(shí),將會有一個(gè)數(shù)據(jù)管理器接口3提供給它。數(shù)據(jù)管理器是策略模式(Strategy pattern)4的一個(gè)主要應(yīng)用。
3LWMDataButler.h中定義的接口4見Gamma,Helm,Johnson Vlissides的設(shè)計(jì)模式。
這樣就完成了語言設(shè)計(jì)的第一個(gè)目標(biāo)。通過給宏處理程序提供不同的數(shù)據(jù)管理器,就可將UTL的文法設(shè)置成便于完成應(yīng)用和任務(wù)。各個(gè)數(shù)據(jù)管理器工具都能接受一個(gè)適于其任務(wù)的關(guān)鍵字集(宏),并且拒絕不能接受的關(guān)鍵字。另外,不同的數(shù)據(jù)管理器可以用不同的方式來使用一給定關(guān)鍵字,從而允許模板代碼與應(yīng)用的基礎(chǔ)無關(guān)。此舉在允許多個(gè)基本數(shù)據(jù)模型不同的產(chǎn)品從同一模板進(jìn)行工作時(shí)非常有用。
<pre listing-type="program-listing"><![CDATA[LWMDataButler接口具有5個(gè)進(jìn)入點(diǎn)  //不帶參數(shù)的過程宏控制  virtual LWTBoolean SubstituteValue(   const LWTString &amp; MacroName,   LWTString &amp; ExpansionValue)=0;  //帶參數(shù)的過程宏控制  virtual LWTBoolean SubstituteValue(   const LWTString &amp; MacroName,   LWMStringList &amp; ParameterList   LWTString &amp; ExpansionValue)=0;  //不帶參數(shù)的迭代因子宏控制  virtual LWTBoolean StartIteration(  const LWTString &amp; IterName)=0;  //帶參數(shù)的迭代因子宏控制virtual LWTBoolean StartIteration(   const LWTString &amp; IterName,   LWMStringList &amp; ParameterList)=0;  //迭代因子宏的迭代控制  virtual LWTBoolean NextIteration(  const LWTString &amp; IterName)=0;  MCDataButlerI]]></pre>UTL的第二個(gè)設(shè)計(jì)目標(biāo)是向用戶提供盡量多的功能,并允許用戶出版其自已的代碼以供再使用。
由于一個(gè)UMA模型的隱喻(metaphor)要在非常抽象的水平上—對象和特性—處理所有的數(shù)據(jù),所以模板語言的許多文法單元可被抽象地編寫。這些單元可被聚集在一起以形成任何基于UMA產(chǎn)品的語言的主體。用戶可以在一些產(chǎn)品指定的區(qū)域中擴(kuò)充這個(gè)基礎(chǔ)。理想情況下,語言應(yīng)該不僅對用戶是可擴(kuò)展的,而且對用戶產(chǎn)品的終端用戶來說也應(yīng)是可擴(kuò)展的。這一點(diǎn)可通過我們的解決方案來完成。
該解決方案需解決以下兩個(gè)基本問題1·需要有一種機(jī)制來共享工具。隨著新關(guān)鍵字的添加,它們必須被公開出來。
2·需要有一種機(jī)制來控制宏執(zhí)行的文字說明。此處我們指的是UMA模型在運(yùn)行時(shí)的狀態(tài),還有宏所影響的特定對象或特性。
為了滿足這些標(biāo)準(zhǔn),在UMA中存在有一個(gè)數(shù)據(jù)bulter的基本工具。這種工具(MCDataButlerI)提供了機(jī)制以用于遞增地定義所需的文法,并且用于管理UMA模型中的文字信息。
這種工具是LWMDataButler接口的一個(gè)超集。盡管LWMDataButler接口已被公開,但用戶在使用一數(shù)據(jù)管理器時(shí)無需考慮它。LWMDataButler中的工具完成了在LWMDataButler接口的使用中所必需的全部工作。
首先,LWMDataButler管理著宏管理程序的注冊表。宏管理程序是這樣一個(gè)對象,它能夠知道如何執(zhí)行一個(gè)被賦予文字說明的特定動作。從概念上講,宏管理程序是命令模式(Command pattern)6的一個(gè)例子。數(shù)據(jù)管理器保持有宏管理程序的一個(gè)字典(它以宏名稱為關(guān)鍵字)。當(dāng)宏處理程序請求數(shù)據(jù)管理器來處理一個(gè)宏(例如,通過SubstituteValue())時(shí),數(shù)據(jù)管理器將在其字典內(nèi)找到適當(dāng)?shù)暮旯芾沓绦虿⑶抑铝τ诳刂圃摮绦颉:旯芾沓绦驅(qū)φ埱筮M(jìn)行處理并將控制返回至數(shù)據(jù)管理器,而數(shù)據(jù)管理器則簡單地將返回值(如果有的話)和成功狀態(tài)轉(zhuǎn)發(fā)給宏處理程序。
宏管理程序公開了一個(gè)接口以供數(shù)據(jù)管理器調(diào)用<pre listing-type="program-listing"><![CDATA[virtual LWTBoolean Exexute(   MCDataButlerI * Butler   const LWTString &amp; MacroName,   LWMStringList * Parameters   LWTString * ExpansionValue)=0;  MCDataButlerI為注冊一個(gè)新的管理程序公開了一個(gè)實(shí)現(xiàn)代碼(implementation signature)  void AddHandler(   const LWTString &amp; Macro   MCMacroHandlerBase * Handler);]]></pre>5在MCDataButlerInterface.h中找到的實(shí)現(xiàn)6Op cit.設(shè)計(jì)模式。
為了實(shí)現(xiàn)一個(gè)文法,用戶可以制作一個(gè)MCDataButlerI的工具并使用全部所需的宏管理程序。另外,由于宏管理程序注冊表是數(shù)據(jù)管理器的一個(gè)成員變量,而不是一個(gè)單純量,所以用戶能夠?qū)σ延械臄?shù)據(jù)管理器分為子類。此舉為用戶提供了對于子類所知道的所有宏再加上他們已經(jīng)開發(fā)出來的那些。它的一個(gè)例子就是OR-Compass ForwardEngineering數(shù)據(jù)管理器,它分成子類MCDataButler。后者使用了大量的初始宏以用于創(chuàng)建對象、讀取特性、進(jìn)行迭代、構(gòu)筑變量、等等。Forward Engineering數(shù)據(jù)管理器使用僅與Forward Engineering相關(guān)聯(lián)的一個(gè)或兩個(gè)宏(如,一個(gè)用于確定數(shù)據(jù)庫命令的正確執(zhí)行的宏),并且用一個(gè)完成文法結(jié)束以用于發(fā)出DDL。
第二,MCDataButlerI還能管理一個(gè)文字堆棧。該文字堆棧允許宏管理程序獲知宏運(yùn)行時(shí)以UMA模型中什么樣的對象為參考。例如,Property()宏在一個(gè)對象中檢索被命名的特性。用于Property()的宏管理程序需要知道應(yīng)該詢問哪個(gè)對象。
MCDataButlerI保持了一個(gè)對象參考的堆棧并且公開了一個(gè)接口以用于在該堆棧中推入或彈出對象并且用于詢問堆棧。宏管理程序哪個(gè)詢問這個(gè)接口以找出它們操作的文字說明。
MCobject*GetCurrentContext(void);void PopCurrentContext(void);void PushCurrentContext(MCObject*Object);另外,MCDataButlerI公開了一個(gè)工具,它允許MCObject迭代因子來自動管理上下文。用于迭代因子宏的宏管理程序能夠通過具體舉例來說明迭代因子代理。這是一個(gè)能夠自動保持用于迭代因子的文字堆棧的對象。每個(gè)順序迭代都會造成彈出和推入發(fā)生。當(dāng)再沒有項(xiàng)目要往返移動時(shí),堆棧將被彈出,并且保持與迭代因子相遇時(shí)出現(xiàn)的狀態(tài)。這些迭代因子代理被保持在其自身的堆棧內(nèi)以用于管理成堆的迭代因子。
例子—以下的樣本代碼顯示了Property宏是如何根據(jù)文字說明而表現(xiàn)出不同的特性。假設(shè)一個(gè)名為“MyTable1”的項(xiàng)目具有一個(gè)屬性“MyColumn1”以及一第二屬性“MyColumn2”。假設(shè)名為“MyTable2”的第二項(xiàng)具有一個(gè)屬性“MyColumn3”。在此模板代碼執(zhí)行時(shí),我們預(yù)先假設(shè)由于其它一些代碼的存在而使模型位于堆棧的頂部。
<pre listing-type="program-listing"><![CDATA[{ <paragraph id="d114"></paragraph>輸入ForEach(“UOEntities”)  begin   Property(“UPName”)   ForEach(“UPAttributes”)   begin   Property(“UPName”)   end  end  }  MyTable1 MyColumn1 MyColumn2 MyTable2 MyColumn3<paragraph id="d115"></paragraph>輸出]]></pre>
權(quán)利要求
1.一種用于提供可擴(kuò)展宏語言的方法,包括對宏語言表達(dá)式進(jìn)行分析;根據(jù)預(yù)定的宏語言語法,在被分析的宏語言表達(dá)式中確定一個(gè)或多個(gè)關(guān)鍵字,該關(guān)鍵字代表先前未在宏語言中定義的宏命令;從關(guān)鍵字注冊表中檢索與關(guān)鍵字相關(guān)聯(lián)的代碼;以及執(zhí)行與上述關(guān)鍵字相關(guān)聯(lián)的代碼。
2.如權(quán)利要求1所述的用于提供可擴(kuò)展宏語言的方法,還包括通過插入一個(gè)新的關(guān)鍵字以及與此新關(guān)鍵字相關(guān)的代碼,來擴(kuò)充關(guān)鍵字的注冊表。
3.一種用于提供可擴(kuò)展宏語言的系統(tǒng),其特征在于包括具有預(yù)定語法的語法分析程序,用于確定一個(gè)或多個(gè)置入宏語言表達(dá)式中的擴(kuò)充關(guān)鍵字,擴(kuò)充的關(guān)鍵字代表未在預(yù)定宏語言的宏命令集中定義的宏命令;具有一個(gè)或多個(gè)關(guān)鍵字及相關(guān)代碼的關(guān)鍵字注冊表;以及與語法分析程序相連的宏管理程序,用于從語法分析程序接收擴(kuò)充的關(guān)鍵字,該宏管理程序響應(yīng)接收到的擴(kuò)充關(guān)鍵字,從關(guān)鍵字注冊表中檢索出一個(gè)與接收到的關(guān)鍵字相關(guān)的代碼,并且執(zhí)行代碼以運(yùn)行由此擴(kuò)充代碼所代表的宏命令。
4.如權(quán)利要求3所述的可擴(kuò)展宏語言,其特征在于上述關(guān)鍵字注冊表可以添加新的關(guān)鍵字及其相關(guān)代碼。
5.一種用于對宏語言表達(dá)式進(jìn)行語法分析的方法,包括對宏語言表達(dá)式進(jìn)行語法分析;以及根據(jù)預(yù)定的宏語言語法,在被分析的宏語言表達(dá)式中確定一個(gè)或多個(gè)關(guān)鍵字,所述關(guān)鍵字代表未在宏語言的預(yù)定宏命令集中定義的宏命令。
全文摘要
本發(fā)明提供了一種用于可擴(kuò)展宏語言的方法和系統(tǒng)。這種用于提供可擴(kuò)展宏語言的系統(tǒng)包括語法分析程序以及宏管理程序(110),用于處理先前未在宏語言中定義的宏命令。語法分析程序(102)對宏語言表達(dá)式中的關(guān)鍵字進(jìn)行分析,并識別出一個(gè)或多個(gè)代表先前未在宏語言中定義的宏命令的關(guān)鍵字(116)。宏管理程序(110)接收宏表達(dá)式中的關(guān)鍵字,并且在關(guān)鍵字注冊表中檢索一個(gè)與該關(guān)鍵字相關(guān)的可執(zhí)行代碼或過程(112)??蓤?zhí)行代碼(112)被運(yùn)行以處理由該關(guān)鍵字所代表的宏命令。模板語言注冊表可被擴(kuò)充以包括用于宏語言擴(kuò)充的任何關(guān)鍵字及其相關(guān)的代碼。
文檔編號G06F9/46GK1361891SQ99812038
公開日2002年7月31日 申請日期1999年10月15日 優(yōu)先權(quán)日1998年10月16日
發(fā)明者塔德A·德弗勒, 埃里克·明茨 申請人:聯(lián)合想象計(jì)算機(jī)公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
双峰县| 宾川县| 湘阴县| 库尔勒市| 宜兰县| 泸溪县| 射洪县| 惠安县| 南木林县| 十堰市| 静乐县| 常德市| 石棉县| 肥乡县| 隆子县| 万山特区| 仙居县| 扶绥县| 田阳县| 平远县| 永济市| 嘉禾县| 修文县| 白玉县| 易门县| 四子王旗| 光泽县| 黎平县| 凤城市| 老河口市| 临城县| 榆林市| 五莲县| 行唐县| 盐山县| 米易县| 宣汉县| 临高县| 裕民县| 剑河县| 宾川县|