麻豆精品无码国产在线播放,国产亚洲精品成人AA片新蒲金,国模无码大尺度一区二区三区,神马免费午夜福利剧场

一種選擇語句優化編譯方法與流程

文檔序號:11250679閱讀:552來源:國知局
一種選擇語句優化編譯方法與流程

本發明屬于編譯器處理領域,具體涉及一種iec61131-3結構化文本編程語言選擇語句編譯優化的方法。



背景技術:

在工業控制領域中,iec61131-3是通用的國際標準,該標準定義了結構化文本st的語法和文法,通常將st語言翻譯為二進制中間指令,然后解釋執行。在st語言中,case選擇語句是使用頻率較高的語句,st語言定義的case語句文法為:

caseexpressionof

case_value1:statementlist1

case_value2:statementlist2

case_valuen:statementlist2

elsestatementlistn+1

endcase;

例如:

casevarof

1:statementlist1;(*var=1執行語句1,*)

2,3:statementlist2;(*var=2或3執行語句2*)

10..20:statementlist3;(*10<=var<=20執行語句3*)

25,30..40:statementlist4;(*var=25或30<=var<=40執行語句5*)

elsestatementlistn+1;(*上述分支條件不滿足,執行該語句*)

endcase;

每個case分支的求值表達式可以是單個常量,可以是通過逗號,并列的多個常量,或通過..表示的范圍。這種文法定義和pascal、c語言的定義存在較大不同,不能直接使用基于跳轉表、查找表的翻譯方法。通常的方法是轉換為if-elseif-else的等價語句,然后進行翻譯。由于工業實時控制領域,對指令的運行效率要求極高,需要對case語句進行優化翻譯。在實際使用過程中,選擇語句的分支求值表達式在極大多數的情況下是常量,故在語義階段,可對求值表達式進行類型分析,當所有分支的求值表達式都是單個常量時,可使用跳轉表的翻譯方法;當存在1個分支的求值表達式是多個常量或常量區間時,根據連接符號(,和..)的功能定義,可在跳轉表中插入短路求值指令,提高執行效率。本案由此產生。



技術實現要素:

本發明的目的是克服現有技術的不足,提高iec61131-3標準的case(選擇)語句執行效率,提供一種選擇語句優化翻譯方法。

為了實現該目的,本發明采用如下技術方案,其特征在于,對于基于iec61131-3標準的st結構化文本語言的case選擇語句進行編譯,根據case(選擇)語句的各個分支求值表達式類型,采用對應的優化翻譯模式,具體包括如下內容:

當各個分支求值表達式都是單個常量時,采用直接跳轉表翻譯模式;

當至少存在1個分支求值表達式是多個常量或常量區間時,采用短路求值和跳轉表混合的翻譯模式。

進一步地,當case(選擇)語句的各個分支求值表達式都是單個常量值時,基于直接跳轉表翻譯模式的實現步驟為:

a)在翻譯每個分支前,記錄當前分支的指令的行號;

b)記錄當前分支與分支標號的對應關系;

c)在一遍掃描過程中,形成各個分支的執行指令;

d)掃描完畢后,將b步驟中得到的分支與分支標號的對應關系生成跳轉表(跳轉表由跳轉指令及其他指令組成),并將跳轉指令插入到執行指令前面。

進一步地,當存在1個分支求值表達式是多個變量時(即分支表達式存在逗號,或連續2個點號..),將該分支的求值表達式進行短路求值計算,在跳轉表中插入短路求值指令,包括:

a)對于形如“casevarofa,b:”基于逗號并列的求值表達式,形成或序列的短路求值跳轉指令;

b)對于形如“casevarofa..b:”基于區間的求值表達式,形成與序列的

短路求值跳轉指令;

c)對于形如“casevarofa,b,c..d”存在多個逗號的求值表達式,以逗號為間隔,間隔之間形成或序列的短路求值跳轉指令。

讀取st代碼文本,進行詞法、語法、語義分析,針對“caseexpressionof…end_case;”的文法,提取各case選擇語句序列,獲取case選擇語句的各個分支的求值表達式,判斷各個分支求值表達式類型。

case選擇語句翻譯后的指令包括跳轉表和執行指令。

跳轉表中的標號和某個分支的執行指令標號對應;按照case選擇語句分支的順序,進行逐個求值表達式計算和判斷,當條件滿足時跳轉到指定的執行指令處執行。

采用上述方案后,本發明具有如下有益效果:在語義分析階段,判斷case分支的表達式類型,當所有分支為單個常量時,采用直接跳轉表的高效翻譯方法,當存在復合表達式時,轉換為邏輯表達式進行短路求值,在跳轉表中插入短路求值指令,顯著提高了st語言中case語句翻譯后指令序列的執行效率,適用于對實時性要求高的工業控制領域。

附圖說明

圖1是本發明中case(選擇)語句優化編譯原理圖;

圖2是本發明中case(選擇)語句的跳轉表原理圖;

圖3是本發明中case分支基于短路求值的表達式跳轉表指令示例圖。

具體實施方式

以下將結合附圖,對本發明的技術方案進行詳細說明。

先定義一套中間指令集,優選地,采用三地址碼方式。例如je為相等跳轉指令,使用示例為jevara,lablex,var表示源變量地址,a為比較變量地址,labelx為跳轉標號值。ge為大于比較指令,le為小于比較指令,and為邏輯與運算指令,or為邏輯或運算指令。

具體實現方式如圖1所示,讀取st代碼文本,進行詞法、語法、語義分析,

針對“caseexpressionof…end_case;”的文法,提取各case語句序列,獲取case分支的求值表達式,判斷各個分支求值表達式類型,當各個分支求值表達式都是單個常量時,采用直接跳轉表翻譯模式;當存在1個分支求值表達式是多個常量或常量區間時,采用短路求值和跳轉表混合的翻譯模式。

case(選擇)語句的跳轉表原理如圖2所示,case語句翻譯后的指令包括跳轉表和執行指令。跳轉表中的標號和某個分支的執行指令標號對應。按照case分支的順序,進行逐個求值表達式計算和判斷,當條件滿足時跳轉到指定的執行語句指令處執行。

在語義分析階段,分析出選擇語句(case)的各個分支都是單個常量值時,可采用高效率的基于直接跳轉表翻譯模式,其實現步驟為:

a)在翻譯每個分支前,記錄當前分支的指令的行號;

b)記錄當前分支與分支標號的對應關系;

c)在一遍掃描過程中,形成各個分支的執行指令;

d)掃描完畢后,將b)步驟中得到的分支與分支標號的對應關系生成跳轉表(跳轉表由跳轉指令及其他指令組成),并將跳轉指令插入到執行指令前面。

優選地,單個變量求值的跳轉表指令范式為:(je,var,a,labelx),其中je為相等跳轉指令,即當變量var的值為a時跳轉到標號為labelx的指令處執行。

在語義分析階段,分析出存在至少1個分支求值表達式是多個常量或常量區間時(即分支表達式存在逗號,或連續2個點號..),將該分支的求值表達式進行短路求值計算,在跳轉表中插入短路求值指令,包括:

a)對于形如“casevarofa,b:”基于逗號并列的求值表達式,形成或序列的短路求值跳轉指令。優選地,2個序列并列的求值的跳轉表指令范式為:

(je,var,a,labelx)

(je,var,b,labelx)

只要有1個條件滿足,就短路求值,直接跳轉。

b)對于形如“casevarofa..b:”基于區間的求值表達式,形成與序列的

短路求值跳轉指令。優選地,基于區間的求值表達式的跳轉表指令范式為:

(ge,temp1,var,a)

(le,temp2,var,b)

(and,temp3,temp1,temp2)

(jz,temp3,labelx)

其中ge為大于指令,le為小于指令,and為邏輯與指令,jz為非0跳轉指令,temp1、temp2、temp3為臨時變量,通過臨時變量緩存中間計算結果。

c)對于形如“casevarofa,b,c..d”存在多個逗號的求值表達式,以逗號為間隔,間隔之間形成或序列的短路求值跳轉指令。優選地,“casea,b,c..d:”模式的等價表達式中間指令輸出算法:

1)根據逗號,進行拆分,獲取匹配判斷子序列seq[n]:abc..d

2)基于短路求值形成計算子序列的指令

intnum=0;//臨時變量個數

intseqlab[n];//各個子序列語句執行入口標簽

initlab(&seqlab,n);//給各個分支分配標簽號

for(i=0;i<n;i++){

2.1)如果seq[i]是單變量,則輸出形如

(je,var,a,seqlabel[i]);

num+=1;

2.2)如果seq[i]是區間表達式,則輸出形如

(ge,temp[num],var,c)

(le,temp[num+1],var,d)

(and,temp[num+2],temp[num],temp[num+1])

(jz,temp[num+2],seqlabel[i]);

num+=3;}

以上實施例僅為說明本發明的技術思想,不能以此限定本發明的保護范圍,凡是按照本發明提出的技術思想,在技術方案基礎上所做的任何改動,均落入本發明保護范圍之內。

當前第1頁1 2 
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
主站蜘蛛池模板: 湄潭县| 成安县| 缙云县| 金寨县| 黔西县| 北宁市| 平度市| 宁德市| 望都县| 桦甸市| 关岭| 上高县| 黑龙江省| 临西县| 洛南县| 松潘县| 利津县| 抚远县| 九龙县| 昌宁县| 铜鼓县| 银川市| 丰顺县| 永丰县| 定日县| 宁德市| 加查县| 福建省| 北流市| 武邑县| 炉霍县| 米脂县| 加查县| 巴楚县| 襄樊市| 宽甸| 霞浦县| 合江县| 深泽县| 招远市| 南乐县|