自动机层次化建模方案(1)——自动机到代码的翻译
自动机由状态和变迁两部分组成,其翻译涉及到将状态和变迁上所对应的内容翻译到可以描述模型的代码上。自动机提供了整个所需执行逻辑的框架,框架有变迁、状态、组件组成。
翻译可以看成是由两部分构成,对框架内每个元素的翻译和对对整个框架的结构翻译。
本部分将按照如下顺序进行说明:变迁的翻译、状态的翻译、组件的翻译、图形函数的翻译以及整个自动机框架的翻译。
- 变迁的翻译。变迁离开的状态或节点后面是并列的条件分支语句,变迁的最后是跳转语句,跳转到其后继的状态或者节点对应的标签处。由于变迁是由更细小的条件、动作和通信组成的。在实行翻译之前,需要对其正确性进行校验,通信的内容不能夹在在动作的代码中,其可以出现在条件和动作之前,或者条件和动作之间,条件只能出现在动作之前,其中动作是用户使用C语言直接写的代码。如果有通信出现在条件之后,则,将条件翻译成分支语句中的判断条件,将通信对应成具体的执行代码插入在动作对应的代码之前。如果通信出现在条件和动作之间,用于条件分支的表达式将用来判断是消息的通信是否不被阻塞,只有在消息不被阻塞的时候,才会进入后续的执行过程,只不过在后续的执行过程对应的条件不为永真的话,则需要在后面的动作代码前添加可以阻塞的条件守卫。
- 状态的翻译。每个状态都有一个一个标签,可以运行由其他代码段跳转到该标签,状态翻译取决于状态的类型,状态分为历史状态和非历史状态,对应的到的翻译代码需要一个变量记录该历史状态当前执行到的子状态,当有变迁从该历史状态迁出的时候,该变量记录的就是离开该历史状态时所处的子状态,当再次进入该历史状态的时候,将直接跳转到最后离开时的状态。非历史状态则不需要进行此步骤。每个状态都有进入、保持、离开三个阶段所对应的动作,这些动作是用户填写的C语言代码,分别将这三段代码的位置放置在状态代码段的开头、中间和变迁的出口处,其中中间部分的代码也要有一个内部标签,使得在时间刷新时可以反复执行。
- 组件的翻译。组件的对应的结构是内嵌在其中的。作为已经被翻译好的内容,在被外部应用的时候,不需要考虑内部内容如何,翻译的时候需要对其进行语法校验,要确输入变迁只有一个,离开组件的变迁也只有一个。输入变迁能为组件的输入赋值、输出变迁只能将组件输出的值输出的到模型中,翻译所要做的事情是完成输入、输出变量的赋值。
- 图形函数的翻译。图形函数的调用很简单,将其签名带入参数后之间对应到相应的代码段中。图形化函数有输入、输出变量,翻译需要对输入和输出变量赋值。图形化函数是用节点和变迁的表示。变迁中不可以包含通信,采用变迁的翻译方式,节点域状态相似,但是没有内嵌代码和状态以及其他信息,节点直接对应成相应的变迁。
- 自动机框架的翻译。自动机框架的翻译指的是状态嵌套结构的翻译,对于某个自动机状态的嵌套层次可以看做是一棵树。有一个变迁由状态A指向状态B的时候,首先将从状态嵌套树上找到A和B最底层的父亲C,将A状态由底至顶依次跳转的到其父亲的离开动作对应的代码,直到C为止,之后由上至下依次跳转到其孩子的进入动作对应的代码,直到B为止。
浙公网安备 33010602011771号