一种选择语句优化编译方法与流程

文档序号:11250679阅读:398来源:国知局
一种选择语句优化编译方法与流程

本发明属于编译器处理领域,具体涉及一种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