本發(fā)明涉及一種excel公式面向?qū)ο笳Z言的轉(zhuǎn)換方法,尤其涉及一種基于遞歸替換展開回溯的excel公式轉(zhuǎn)換方法。涉及專利分類號g06計(jì)算;推算;計(jì)數(shù)g06f電數(shù)字?jǐn)?shù)據(jù)處理g06f17/00特別適用于特定功能的數(shù)字計(jì)算設(shè)備或數(shù)據(jù)處理設(shè)備或數(shù)據(jù)處理方法。
背景技術(shù):
excel軟件中集成有大量的數(shù)學(xué)運(yùn)算公式,并且能夠提供一定范圍的自定義函數(shù)功能,大量的一線辦公人員都能夠完成在excel軟件中熟練的編輯公式,但是由于excel軟件非開源的免費(fèi)軟件,軟件中的公式和編輯的公式都有固定格式,只能限制在微軟的辦公環(huán)境中使用。
而隨著工業(yè)領(lǐng)域/知識自動(dòng)化程度的不斷加深,并且在積極的移植到工程中間件平臺,以便驅(qū)動(dòng)各種軟件、硬件和設(shè)備,從而完成原本需要人去完成的大部分工作,將人解放出來去做更加高級、更具創(chuàng)造性的工作。為了實(shí)現(xiàn)知識自動(dòng)化,原來數(shù)據(jù)材料將被有效整合,在這個(gè)過程中,需要將原有的只能在excel文件中使用的公式,用新的軟件語言描述,以實(shí)現(xiàn)在其它領(lǐng)域、平臺和軟件中進(jìn)行有效的移植。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的一種基于遞歸替換展開回溯的excel公式面向?qū)ο笳Z言的自動(dòng)轉(zhuǎn)換方法,包括如下步驟:
—針對excel的需要轉(zhuǎn)換為面向?qū)ο笳Z言的數(shù)學(xué)公式,在excel表格列頭備注返回值;
—對備注返回值的數(shù)學(xué)公式,采用逆波蘭規(guī)則、結(jié)合預(yù)定義公式集和excel中的運(yùn)算符,自動(dòng)提取公式中的參數(shù);對提取后的參數(shù)進(jìn)行修飾;
—將參數(shù)修飾后的數(shù)學(xué)公式進(jìn)行解析,對復(fù)雜的數(shù)學(xué)公式逐級簡化為所述數(shù)學(xué)公式對應(yīng)的多個(gè)原子公式;
—按所述的面向?qū)ο笳Z言逐級回溯所述的多個(gè)原子公式,直至全部數(shù)學(xué)公式完成轉(zhuǎn)換。
作為優(yōu)選的實(shí)施方式,所述的在excel表格列頭備注返回值具體包括如下方式:
—根據(jù)單元格值,自動(dòng)確定備注類型:
如果備注單元格值能夠被高級語言自動(dòng)分析識別為數(shù)值類型的單元格,直接備注為當(dāng)前數(shù)值類型;其它類型直接備注為字符串類型;
—定義成動(dòng)態(tài)類型:對于自有編譯或者編譯器的轉(zhuǎn)換目標(biāo)語言,定義成動(dòng)態(tài)類型。
更進(jìn)一步的,根據(jù)待轉(zhuǎn)換的表格列頭中數(shù)值和文本數(shù)據(jù)類型的相對數(shù)量,直接添加后綴。
作為優(yōu)選的實(shí)施方式,所述的提取公式中參數(shù)的步驟過程如下:
—預(yù)處理:將excel公式集中常量進(jìn)行替換:將數(shù)據(jù)公式中的字母全部轉(zhuǎn)換為大寫字母;
—替換展開:用逆波蘭規(guī)則,遍歷所述的數(shù)學(xué)公式:發(fā)現(xiàn)括號進(jìn)行替換處理,如果發(fā)現(xiàn)需替換的公式是預(yù)定義公式集,則連同預(yù)定義公式和括號里面的表達(dá)式同時(shí)替換;否則只替換括號里的內(nèi)容。
作為優(yōu)選的實(shí)施方式,所述的參數(shù)修飾的規(guī)則為表格列頭添加附加修飾名:
列名[_附加修飾符]
附加修飾符至少包含兩種:_pre和_nxt,其中_pre表示引用某個(gè)單元格比當(dāng)前行小的對應(yīng)列數(shù)據(jù),上一行為_pre,上兩行為_pre_pre;_nxt表示引用某個(gè)單元格比當(dāng)前行大的對應(yīng)列數(shù)據(jù),后一行為_nxt,后兩行為_nxt_nxt。
作為優(yōu)選的實(shí)施方式,所述的逆波蘭展開過程如下
—從左至右掃描一excel公式;
—若讀取的是操作數(shù),則判斷該操作數(shù)的類型,并將該操作數(shù)存入操作數(shù)堆棧;
—若讀取的是運(yùn)算符:若該運(yùn)算符為左括號"(",則直接存入運(yùn)算符堆棧;若該運(yùn)算符為右括號")",則輸出運(yùn)算符堆棧中的運(yùn)算符到操作數(shù)堆棧,直到遇到左括號為止;
—該運(yùn)算符為非括號運(yùn)算符:若運(yùn)算符堆棧棧頂?shù)倪\(yùn)算符為括號,則直接存入運(yùn)算符堆棧;若比運(yùn)算符堆棧棧頂?shù)倪\(yùn)算符優(yōu)先級高或相等,則直接存入運(yùn)算符堆棧;若比運(yùn)算符堆棧棧頂?shù)倪\(yùn)算符優(yōu)先級低,則輸出棧頂運(yùn)算符到操作數(shù)堆棧,并將當(dāng)前運(yùn)算符壓入運(yùn)算符堆棧;
—當(dāng)表達(dá)式讀取完成后運(yùn)算符堆棧中尚有運(yùn)算符時(shí),則依序取出運(yùn)算符到操作數(shù)堆棧,直到運(yùn)算符堆棧為空。
更進(jìn)一步的,逆波蘭表達(dá)式求值過程如下:
—循環(huán)掃描excel公式中的項(xiàng)目;
如果掃描的項(xiàng)目是操作數(shù),則將其壓入操作數(shù)堆棧,并掃描下一個(gè)項(xiàng)目;如果掃描的項(xiàng)目是一個(gè)二元運(yùn)算符,則對棧的頂上兩個(gè)操作數(shù)執(zhí)行該運(yùn)算;
如果掃描的項(xiàng)目是一個(gè)一元運(yùn)算符,則對棧的最頂上操作數(shù)執(zhí)行該運(yùn)算。
通過采用上述技術(shù)方案,本發(fā)明公開的一種基于遞歸替換展開回溯的excel公式面向?qū)ο笳Z言的自動(dòng)轉(zhuǎn)換方法,通過采用逆波蘭規(guī)則結(jié)合預(yù)定義公式集和excel中的運(yùn)算符,自動(dòng)提取公式中的參數(shù),生成面向?qū)ο笳Z言中能夠使用的公式。使得不具有特定編程語言能力的人群也能夠使用excel進(jìn)行特定的運(yùn)算、公式編輯和處理,算法構(gòu)思巧妙,在自動(dòng)化編程中有著廣闊的應(yīng)用場景。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖做簡單地介紹,顯而易見,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。
圖1為本發(fā)明的流程圖
圖2為本發(fā)明實(shí)施例中生成對應(yīng)面向?qū)ο笳Z言代碼的算法流程圖
圖3為本發(fā)明實(shí)施例中的替換列表
圖4為本發(fā)明實(shí)施例中的回溯列表
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
如圖1、圖2、圖3和圖4所示,基于遞歸替換展開回溯的excel公式面向?qū)ο笳Z言的自動(dòng)轉(zhuǎn)換方法,主要包括如下步驟:
考慮到對于工程人員來說,每一個(gè)公式是字符串還是數(shù)值是很清楚的,但是對于面向?qū)ο笳Z言的翻譯器是不清楚的。故為了保證從excel公式轉(zhuǎn)換為代碼的準(zhǔn)確性,作為優(yōu)選的實(shí)施方式,針對excel的需要轉(zhuǎn)換為面向?qū)ο笳Z言的數(shù)學(xué)公式,在excel表格列頭備注返回值。
采用的主要方式有三種,
1.根據(jù)單元格值,自動(dòng)確定,
(1)能夠parse(高級語言的自動(dòng)分析)為double(數(shù)值)類型我們認(rèn)為,這個(gè)單元格就是double類型。
(2)除了(1)以為的都是字符串(文本)。
這種規(guī)則存在一定瑕疵,在實(shí)施過程中,由于工程人員難以理解復(fù)雜的面向?qū)ο笳Z言,導(dǎo)致很難分辨:0和“0”的區(qū)別,就目前我們的工程應(yīng)用而言,這個(gè)工程是以數(shù)值為主,其類型準(zhǔn)確率為97%。
2.dynamic動(dòng)態(tài)類型
針對特定的一類程序語言(1)c#(2)弱類型語言,如vb,php等,這類語言類型都可以自己有編譯或者翻譯器確定。如果對于c++或者java這樣的語言是不行的。
3.直接在列頭后加后綴,
考慮到,通常的運(yùn)算場景下,返回值類型只有兩種,數(shù)值和文本(字符串),所以通常的標(biāo)注都具有一定的偏向性,譬如數(shù)值多而文本少,通常的做法只標(biāo)注為文本類型,在列頭名稱后面加s,表示文本。
反之,如果是數(shù)值類型數(shù)據(jù)占比較少,而文本類型占比較多,則只需要標(biāo)注n。
如果所占比例持平,選擇標(biāo)注文本或者數(shù)值類型,對算法的影響一樣的進(jìn)一步的,考慮到本發(fā)明主要應(yīng)用場景為工程是數(shù)值為主,所以在本發(fā)明實(shí)施例中只標(biāo)注s。
也可根據(jù)具體的翻譯對象和實(shí)際應(yīng)用場景,自主設(shè)定選擇比例,靈活選擇標(biāo)注數(shù)據(jù)類型。
對備注返回值的數(shù)學(xué)公式,采用逆波蘭規(guī)則、結(jié)合預(yù)定義公式集和excel中的運(yùn)算符,自動(dòng)提取公式中的參數(shù);對提取后的參數(shù)進(jìn)行修飾。
一、將中綴表達(dá)式轉(zhuǎn)換成后綴表達(dá)式算法:
1、從左至右掃描一中綴表達(dá)式。
2、若讀取的是操作數(shù),則判斷該操作數(shù)的類型,并將該操作數(shù)存入操作數(shù)堆棧
3、若讀取的是運(yùn)算符,則具體判斷如下:
(1)該運(yùn)算符為左括號"(",則直接存入運(yùn)算符堆棧。
(2)該運(yùn)算符為右括號")",則輸出運(yùn)算符堆棧中的運(yùn)算符到操作數(shù)堆棧,直到遇到左括號為止。
(3)該運(yùn)算符為非括號運(yùn)算符:
(a)若運(yùn)算符堆棧棧頂?shù)倪\(yùn)算符為括號,則直接存入運(yùn)算符堆棧。
(b)若比運(yùn)算符堆棧棧頂?shù)倪\(yùn)算符優(yōu)先級高或相等,則直接存入運(yùn)算符堆棧。
(c)若比運(yùn)算符堆棧棧頂?shù)倪\(yùn)算符優(yōu)先級低,則輸出棧頂運(yùn)算符到操作數(shù)堆棧,并將當(dāng)前運(yùn)算符壓入運(yùn)算符堆棧。
4、當(dāng)表達(dá)式讀取完成后運(yùn)算符堆棧中尚有運(yùn)算符時(shí),則依序取出運(yùn)算符到操作數(shù)堆棧,直到運(yùn)算符堆棧為空。
逆波蘭表達(dá)式求值算法過程如下:
1、循環(huán)掃描語法單元的項(xiàng)目。
2、如果掃描的項(xiàng)目是操作數(shù),則將其壓入操作數(shù)堆棧,并掃描下一個(gè)項(xiàng)目。
3、如果掃描的項(xiàng)目是一個(gè)二元運(yùn)算符,則對棧的頂上兩個(gè)操作數(shù)執(zhí)行該運(yùn)算。
4、如果掃描的項(xiàng)目是一個(gè)一元運(yùn)算符,則對棧的最頂上操作數(shù)執(zhí)行該運(yùn)算。
針對excel里的函數(shù)而言,本發(fā)明設(shè)有預(yù)定義公式集,譬如excel里面有一個(gè)max函數(shù),我們在翻譯的目標(biāo)中需要定義這個(gè)函數(shù)。
這是max在c#語言中的一個(gè)例子。另一個(gè)例子,excel中的and函數(shù),
excel里面是and(exp1,exp2,…),目標(biāo)語言沒有and函數(shù),我們需要有對應(yīng)的翻譯方法,這里我們翻譯為(exp1)&&(exp2)&&…
(3)針對excel中的特殊運(yùn)算符
譬如,excel中對的運(yùn)算符a^2表示平方,目標(biāo)語言沒有,我們識別后,將其翻譯為a*a。
—預(yù)處理:將將excel公式集中常量進(jìn)行替換,將數(shù)據(jù)公式中的字母全部轉(zhuǎn)換為大寫字母,pi()都替換為pi。
—替換展開:用逆波蘭規(guī)則,遍歷所述的數(shù)學(xué)公式:發(fā)現(xiàn)括號進(jìn)行替換處理,如果發(fā)現(xiàn)需替換的公式是預(yù)定義公式集,則連同預(yù)定義公式和括號里面的表達(dá)式同時(shí)替換;否則只替換括號里的內(nèi)容。
將參數(shù)修飾后的數(shù)學(xué)公式進(jìn)行解析,對復(fù)雜的數(shù)學(xué)公式逐級簡化為所述數(shù)學(xué)公式對應(yīng)的多個(gè)原子公式的過程
—按所述的面向?qū)ο笳Z言逐級回溯所述的多個(gè)原子公式,直至全部數(shù)學(xué)公式完成轉(zhuǎn)換。
自動(dòng)轉(zhuǎn)換方法,其特征還在于所述的參數(shù)修飾的規(guī)則為表格列頭添加附加修飾名:
列名[_附加修飾符]
附加修飾符至少包含兩種:_pre和_nxt,其中_pre表示引用某個(gè)單元格比當(dāng)前行小的對應(yīng)列數(shù)據(jù),上一行為_pre,上兩行為_pre_pre;_nxt表示引用某個(gè)單元格比當(dāng)前行大的對應(yīng)列數(shù)據(jù),后一行為_nxt,后兩行為_nxt_nxt。
完成公式的回溯之后,生成公式對應(yīng)的面向?qū)ο蟮拇a即可完成最終的轉(zhuǎn)換,得到能夠被目標(biāo)面向?qū)ο笳Z言識別的數(shù)學(xué)公式。作為可選的實(shí)施方式(并非本發(fā)明優(yōu)選的實(shí)施方式),結(jié)合圖2和如下偽代碼即可實(shí)現(xiàn)。
本發(fā)明是實(shí)例中記載的故障診斷方法和系統(tǒng)只以上述實(shí)施例為例,但不僅限于此,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對前述各實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實(shí)施例技術(shù)方案的范圍。因此,本發(fā)明將不會被限制于本文所示的這些實(shí)施例,而是要符合與本文所公開的原理和新穎特點(diǎn)相一致的最寬的范圍。