首页> 中国专利> 高阶程序语言自动转换成活动图的方法

高阶程序语言自动转换成活动图的方法

摘要

一种高阶程序语言(High Level Language)自动转换成活动图(Extended Activity Diagram,EAD)的方法,当要将高阶程序语言(例如:Java、C、C++)转换成硬件描述语言时,必须要将以高阶程序语言所撰写的程序原始码先转换成一活动图(Activity Diagram)。本发明在编译器(compiler)中增加新的转换规则,并修改UML程序语言中的活动图规格,将程序原始码转换成相对应的活动图,以可视化的方式呈现原始码的程序逻辑和执行流程。本发明可将高阶程序语言转换成统一的格式来表示,同时,活动图将有利于后续转换成硬件描述语言时所需的仿真及需求。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2014-03-12

    未缴年费专利权终止 IPC(主分类):G06F9/44 授权公告日:20090311 终止日期:20130118 申请日:20060118

    专利权的终止

  • 2009-08-26

    专利申请权、专利权的转移(专利权的转移) 变更前: 变更后:

    专利申请权、专利权的转移(专利权的转移)

  • 2009-03-11

    授权

    授权

  • 2007-09-19

    实质审查的生效

    实质审查的生效

  • 2007-07-25

    公开

    公开

说明书

技术领域

本发明是关于一种高阶程序语言自动转换成活动图的方法,尤指一种将高阶程序的原始码转换成相对应的活动图,并以可视化的方式呈现原始码的程序逻辑和执行流程。

背景技术

传统的硬件描述语言(例如:VHDL)并不适合直接描述高阶程序语言的程序逻辑和执行流程,因此,在设计硬件描述状况时,无法直接与高阶程序语言所设计的流程相对应,因而造成设计上的困扰,另外,传统的高阶程序语言亦无法直接转换成硬件描述语言(例如:VHDL),此亦造成设计上的不便,且由于高阶程序语言的种类繁多,例如:Java、C、或C++等,所以尽管所设计程序功能相同,也会因为程序语言的特性而无法统一完整的执行流程,造成硬件组件设计上的困扰,因此,现有的方法无法将高阶程序语言直接转换成硬件描述语言,故有予以改进的必要。

发明内容

本发明提供一种高阶程序语言自动转换成活动图的方法,是于一编译器中加入一转换规则,将该高阶程序语言的原始码自动转换成相对应的活动图,其包括下列步骤:(A)读取一行高阶程序语言的原始码,直至所有原始码均已被读取完成时,输出完整的活动图;(B)如该读取的原始码不为一叙述指令(statement instruction)时,将该非叙述指令转换成相对应的子活动图(sub-graph),再执行步骤(A);(C)如该读取的原始码为一叙述指令时,且该叙述指令中的条件表达式(condition expression)前方有一叙述式(statement)时,将该叙述式(statement)转换成一子活动图(sub-graph);(D)产生一选择节点(select node);(E)产生二中介点(curve point),该二中介点连接选择节点(select node);(F)将叙述指令中的叙述式(statement)转换成相对应的子活动图(sub-graph);(G)产生一合并节点(merge node)以合并子活动图;(H)连接该叙述式经由转换后所产生的子活动图至右中介点;以及(I)连接该叙述式经由转换后所产生的子活动图至合并节点,再执行步骤(A)。最后,(J)再判断是否仍有指令仍未转换成子活动图若仍有,则回到步骤(A)重新读取下一行高阶程序语言的原始码,若以无指令需转换,则输出一个完整的EAD。因此,本发明的高阶程序语言自动转换成活动图的方法,是利用修改UML中的活动图(Activity Diagram),将高阶程序语言以可视化的方式呈现原始码的程序逻辑和执行流程,以利于后续的仿真以及转换为硬件描述语言的需求。

于本发明的高阶程序语言自动转换成活动图的方法中,高阶程序语言包括:Java、C、或C++程序语言。

于本发明的高阶程序语言自动转换成活动图的方法中,活动图是为UML程序语言中定义的延伸活动图(Extendedactivity diagram),其代表一种流程控制图。

于本发明的高阶程序语言自动转换成活动图的方法中,活动图包括:开始(start)、结束(end)、中介点(curve point)、微运算(micro-operation)、分叉(fork)、连结(join)、选择(select)、合并(merge)共八种节点。

于本发明的高阶程序语言自动转换成活动图的方法中,叙述指令包括:for、while、do、if、switch指令。

附图说明

图1是UML中所定义的活动图(activity diagram);

图2是本实施例的所定义的EAD(Extended activitydiagram);

图3是本实施例的Java原始码到EAD转换的实作流程;

图4a是本实施例的For Statement转换成EAD转换的实作流程;

图4b是本实施例的While Statement转换成EAD转换的实作流程;

图4c是本实施例的Do Statement转换成EAD转换的实作流程;

图4d是本实施例的If Statement转换成EAD转换的实作流程;

图4e是本实施例的Switch Statement转换成EAD转换的实作流程;

图5是本实施例的高阶程序语言自动转换成活动图的方法实作流程;

图6a是本实施例的JAVA程序;

图6b是本实施例的JAVA程序及其对应的EAD。

具体实施方式

由于传统的方法无法直接将高阶程序语言直接转换成硬件描述语言,因此,当使用者要将高阶程序语言(例如:Java、C、C++...)转换成硬件描述语言(例如:VHDL)前,必须先将高阶程序语言转换成一个中间格式-在此称为活动图(Activity Diagram,简称AD),AD是一种流程的描述图,请参阅图1所示,  为UML(Unified Modeling Language,UML)中所定义的活动图,其包含有五种组件图:Action state、fork、join、select及merge。在本实施例中,为了要保留一些程序所需的信息,因此必须修改部分AD的组件,所使用的活动图称为EAD(Extended activity diagram,EAD),简称为延伸活动图。

请参阅图2所示,EAD是一种用以将高级语言的原始码转换成相对应的流程的控制图,其由复数个节点(node)所组成,通过由不同节点组合以构成子活动图(sub-graph),每一个子活动图中各自包含了起始、执行及结束等三个部分。在本实施例中,定义了多种不同的节点。以下逐一介绍各种不同的节点:

1.开始(start)节点:表示一个子活动图的开端;

2.结束(end)节点:表示一个子活动图的结束;

3.中介点(curve point)节点:表示两个有方向性的连接线(edge)的连接,对于执行没有实际的影响,通常用于方便转换过程的暂时性用途;

4.微运算(micro-operation)节点:表示表示一个叙述(expression statement)或表示法(expression)的处理;

5.分叉(fork)节点:表示平行执行;

6.连结(join)节点:表示只有当所有的微运算都到达时,才有输出讯号的发出;

7.选择(select)节点:表示在译码后,会选择发出一个适当的输出讯号;以及

8.合并(merge)节点:表示将输入讯号加以合并后输出。

上述每一节点视为一对象,于该对象中会记录两种数据型态以代表连接自己的节点(In-Node)及自己将和其它相连的节点(Out-Node),其节点型态会随语法而改变,在解析每一段语法时,均会产生相对应的子活动图,并记录该子活动图的In-Node及Out-Node以供其它子活动图连接使用。依照此连接方式,每一段语法中子活动图的产生亦使用相同的方式。将每一个子活动图相连的后,即可产生将程序原始码转换成相对应的活动图,以可视化的方式呈现原始码的程序逻辑和执行流程。

在本发明中,一个完整的EAD是由复数个子活动图(sub-graph)所组成,其中,第一个子活动图记载着此一类别(class)的信息,称为类别子活动图;其余的每一个子活动图皆对应一个方法(method)。子活动图的每一部分皆由各种不同的节点(node)组合而成。在类别子活动图中,起始的部分由一开始节点(start node)表示,称此节点为类别开始节点(class start node),类别开始节点中包含了各种的标示(label)。下列说明表示子活动图的各符号介绍:

●C=className,modifier:

C这个符号代表类别,其中说明了这个类别的名字及其修饰子(modifier),修饰子为一数字,其说明如下:

0x0001:PUBLIC;

0x0010:FINAL;

0x0400:ABSTRACT;

0x0800:STRICT;

●G=type,size,variableName:

G这个符号代表全域变量(global variable),其中说明了型态(type)、大小(size)及变量名称。型态和大小的定义与Java相同。

●M=methodName,modifier:

M这个符号代表方法(method),其中说明了方法的名称及修饰子(modifier),修饰子为一数字,其说明如下:

0x0001:PUBLIC;             0x0002:PRIVATE;

0x0004:PROTECTED;          0x0008:STATIC;

0x0010:FINAL;              0x0020:SYNCHRONIZED;

0x0100:NATIVE;             0x0400:ABSTRACT;

0x0800:STRICT;

在本实施例中,类别子活动图中的执行部分亦分为左、右两部分,左为类别变量(class variable)部分,右为对象变量(instance variable)部分。在开始部分与类别变量部分及对象变量部分的间分别有一方向性的连接线(edge)连接,其箭头由开始部分分别指向类别变量部分及对象变量部分。在此两方向性连接在线分别标有“class”及“instance”的文字,称的为连接线标示(edge label)。

类别变量部分及对象变量部分除了第一个节点为开始节点外,其余皆为微运算节点,每个节点的间皆为有方向性的连接线所连接,箭头方向皆为由上而下。类别变量部分的开始节点的内容为“m=sinit,0”,而对象变量部分的开始节点的内容为“m=init,0”。类别变量部分及对象变量部分的微运算节点的内容皆为初始值的宣告。类别变量部分及对象变量部分的结束部分皆由一结束节点表示,其内容分别为“returnVOID sinit”及“return VOID init”。

方法子活动图的起始部分亦由一开始节点代表,其中亦包含了数个标示,说明如下:

●M=methodName,modifier:M这个符号代表方法

(method),其中说明了方法的名称及修饰子

(modifier),修饰子为一数字,其说明如下:

0x0001:PUBLIC;             0x0002:PRIVATE;

0x0004:PROTECTED;          0x0008:STATIC;

0x0010:FINAL;              0x0020:SYNCHRONIZED;

0x0100:NATIVE;             0x0400:ABSTRACT;

0x0800:STRICT;

●R=type,size,retmethodName:R代表此方法的回传信息,其中说明了回传的型态及大小。这里的型态与大小皆与Java相同。

●P=type,size,variableName:P代表所传入的参数(parameter),其中说明了此传入参数的型态、大小及变量名称。这里的型态与大小皆与Java相同。

L=type,size,variableName:L代表区域变量(localvariable),其中说明了此区域变量的型态、大小及变量名称。这里的型态与大小皆与Java相同。

上述为本发明中所使用所有子活动图的图形规格介绍。

本发明提出将高阶程序语言自动转换成延伸活动图的方法。请参阅图3所示的转换流程。在本实施例中,是以JAVA程序语言为例,将JAVA程序实作转换成延伸活动图(EAD)。利用JavaCC(Java Compiler Compiler,以下简称JavaCC)所定义的Java标准语法规格为基础(使用JDK(JavaDevelopment Kit)1.5),在JavaCC的grammar file中加入一段Java程序,而产生一个修改过的Java语法档案(扩展名为jj的档案)。而JavaCC则依据这个Java程序来产生Java解析器(Java Parser)类别以及Java Parser所需要使用到的其它类别,而这个产生出来的Java Parser类别能够提供从Java原始码转换为相对应EAD的功能。在本实施例中,将Java Parser类别整合于一计算机辅助电路设计软件中,使软件具有转换Java原始码至EAD的功能,接着,将完整的Java原始码传入JavaParser中,Java Parser会依照程序中不同的token,对应在语法文件中新产生EAD的指令,然后将EAD图形转换出来。

由于JAVA程序的token形态众多,以下针对几个较具代表性的叙述指令(statement instruction)、条件表达式(conditionexpression)及叙述式(statement)的转换流程及规则进行说明,在本实施例中,叙述指令包括有for、while、do、if、switch等型态。以下以针对叙述指令为例,说明JAVA程序转换成EAD的转换流程及规则进行说明:

实例1For Statement的转换:

其语法如下,请一并参照图4a所示:

for([ForInit()];[Expression()];[ForUpdate()])Statement()

兹以一Java原始码说明如下:

将上述的Java原始码转换过程如下:

step1:解析“for”及“(”;

step2:解析(For Init()),画出图中圆1所代表的节点,设定In-Node及Out-Node,并联机;

step3:解析“;”;

step4:解析(Expression())执行新增的java程序processConditionExpression(),产生Decode Node(D),并产生Decode节点下方接线及其上的线标(edge labe1)

完整画出图中圆2所代表的子图(节点的集合),设定In-Node及Out-Node;

step5:解析“;”;

step6:解析(ForUpdate),画出图中圆3代表的节点;

取得该节点的Out-Node;

step7:解析“)”;

step8:解析Statement()并画出如图中圆4代表的节点;

step9:连接圆2子图所代表expression()的Out-Node及圆3的In-Node;

step10:产生Merge节点如圆5所示;

step11:连接Statement()的Out-Node至Merge节点的In-Node;

step12:连接Merge节点的In-Node及Out-Node的线;

经由上述的步骤,说明将JAVA原始码中For Statement转换成EAD转换的实做过程。

实例2  While Statement的转换:

其语法如下,

while(Expression())Statement()

兹以一Java原始码转换说明如下:

    while(i<=cnt){    sum+=i;    i++;    }

转换的转换过程如下,请一并参照图4b所示:

step1:解析“while”及“(”;

step2:解析Expression(),并产生图中圆1,取得该子图的Out-Node;

step3:执行新增的java程序processConditionExpression(),产生Decode Node(D),并产生Decode节点下方接线及其上的线标(edge label),完整画出图中圆2所代表的子图(节点的集合),设定In-Node及Out-Node;

step4:连接圆2(Expression())的Out-Node及圆1(Statement())的In-Node;

step5:产生Merge节点,如圆3所示;

step6:连接圆1(Statement())的Out-Node至Merge节点;

step7:连接Merge节点的In-Node及Out-Node的线;

经由上述的步骤,说明将JAVA原始码中While Statement转换成EAD转换的实做过程。

实例3Do Statement的转换:

其语法如下,

do Statement()while(Expression());

兹以一Java原始码转换说明如下:

    do{    sum+=i;i++;    }while(i<=cnt);

转换的转换过程如下,请一并参照图4c所示:

step1:解析“do”;

step2:解析Statement()产生如图中圆1所示,并取得其Out-Node;

step3:解析“while”及“(”;

step4:执行新增的java程序processConditionExpression(),产生Decode Node(D),并产生Decode节点下方接线及其上的线标(edge label),完整画出图中圆2所代表的子图(节点的集合),设定In-Node及Out-Node;

step5:解析“)”及“;”;

step6:连接圆1(Expression())的Out-Node及圆2(Statement())的In-Node;

step7:产生Merge节点,如圆3所示;

step7:连接圆2(Statement())的Out-Node至Merge节点;

step8:连接Merge节点的In-Node及Out-Node的线;

经由上述的步骤,说明将JAVA原始码中Do Statement转换成EAD转换的实做过程。

实例4 If Statement的转换:

其语法如下:

if(Expression())Statement()[else Statement()]

兹以一Java原始码转换说明如下:

if(a<0){

b=-a;

}else{

b=a;

}

转换的转换过程如下,请一并参照图4d所示:

step1:解析“if”及“(”;

step2:解析expression(),执行新增的java程序processConditionExpression(),产生Decode Node(D),并产生Decode节点下方接线及其上的线标(edge label)完整画出图中圆1所代表的子图(节点的集合),设定In-Node及Out-Node;

step3:解析“)”;

step4:解析statement()并画出如图中圆2所示,取得该子图的In-Node;

step5:解析“else”;

step6:解析else statement()并画出如图中圆3所示,取得该子图的In-Node;

step7:连接图中圆1(Expression())的Out-node1至圆2(statement())的In-Node;

step8:连接图中圆1(Expression())的Out-node0至圆3(else statement())的In-Node;

step9:产生Merge节点如图中圆4;

step10:连接圆2(statement())的Out-Node至Merge节点;

经由上述的步骤,说明将JAVA原始码中If Statement的转换成EAD转换的实做过程。

实例5Switch Statement的转换

其语法如下,

switch(Expression()){

←(SwitchLabel()(BlockStatement())*)*}

SwitchLabel(){case Expression():default:}

兹以一Java原始码转换说明如下:

    switch(i){    case1:    i++;    break;    case2:    i+=2;    break;    default:    System.out.println(″That′s not a valid no!″);    break;    }

转换的转换过程如下,请一并参照图4e所示:

step1:解析“switch”及“(”;

step2:解析Expression()并储存该变量;

step3:解析“)”及“{”;

step4:解析SwitchLabel(),并将Case expression与的前Expression的变量结合产生如图中圆1,其中含DecodeNode(D)、连接线及线标(Edge Label),并设定两个Out-Node,Out-Node0及Out-Node1;

step5:解析BlockStatement(),并画出如图中圆2,将Out-Node0设为该子图的Out-Node;

step6:解析其它SwitchLabel(),步骤如4,5所述,但第二次以后会加上判断产生Merge节点的判断,如图中圆3,4,5;

step7:产生Merge节点,连接其它Out-Node,如图中圆6。

经由上述的步骤,说明将JAVA原始码中Switch Statement转换成EAD转换的实做过程。

由上述的说明可清楚的了解,本发明中如何将JAVA程序原始码转换成EAD的过程,而随着原始码的不同,转换的过程也会有所不同。

因此,本发明提出一个完整的转换流程,请参阅图5所示,当要将原始码自动转换成相对应的活动图时,首先,读取一行高阶程序语言(high level language)的原始码(步骤S501),接着,判断原始码的型态是否为一叙述指令(statementinstruction)(步骤S502),在本实施例中,叙述指令包括:for、while、do、if、switch指令。当原始码的型态不为上述叙述指令中的其中任一个指令时,将此非叙述指令直接转换成相对应的子活动图(步骤S503),再重新读取下一行高阶程序语言的原始码(步骤S501)。

当于(步骤502)中判断出原始码为一叙述指令时,需再判断条件表达式的前方是否有一叙述式(statement)(步骤S504),若有叙述式(statement)于条件表达式前方,先将叙述式(statement)转换成相对应的子活动图(sub-graph)(步骤S505)。

若无叙述式(statement)于条件表达式前方(statementinstruction),则直接产生一选择节点(select node)(步骤S506);接着,产生二中介点(curve point),该二中介点连接至选择节点(select node)(步骤S507);然后,再将叙述式(statement)转换成相对应的子活动图(sub-graph)(步骤S508)后,产生一合并节点(merge node)以合并子活动图(步骤S509);再连接该叙述式经由转换后所产生的子活动图至右中介点(步骤S510),连接该叙述式经由转换后所产生的子活动图至合并节点(步骤S511),最后,再判断是否仍有指令仍未转换成子活动图(步骤S512),若仍有,则回到步骤S501以重新读取下一行高阶程序语言的原始码的,若以无指令需转换,则输出一个完整子活动图EAD(步骤S513)。

本发明可将一段完整的JAVA程序语言转换成相对应的EAD,以可视化的方式呈现原始码的程序逻辑和执行流程。请参阅图6所示,图6 A为利用If Statement及WHILE Statement所撰写的累加程序,所撰写的累加程序,依据上述的转换流程和规则,可转换成相对应的EAD,如图6B所示。除此之外,相同的程序利用依据上述的转换流程和规则,亦可转换成相对应的EAD。由于JAVA程序语法的不同,因此所产生的EAD也不相同。

由以上的说明可知,本发明的高阶程序语言自动转换成活动图的方法,利用编译器中加入一转换规则,可将多种不同的该高阶程序语言(例如:Java、C、C++...)的原始码自动转换成相对应的活动图(EAD),以可视化的方式呈现原始码的程序逻辑和执行流程。通过由此一个中间格式,可将多种不同的程序语言整合为统一的格式来表示,以利于后续的仿真以及转换为硬件描述语言的需求。

上述实施例仅是为了方便说明而举例而已,本发明所主张的权利范围自应以申请专利范围所述为准,而非仅限于上述实施例。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号