Page 84 - 《软件学报》2021年第6期
P. 84
1658 Journal of Software 软件学报 Vol.32, No.6, June 2021
只在 else 控制的语句块下生成代码(第 6 行).
表 2(b)模型显示一个分段函数,由两个 BooleanSwitch 组件控制 3 个函数段,其中,BooleanSwitch2 组件嵌套
在 BooleanSwitch1 下面.当然,分段函数的模型也可以直接通过多分支组件比如 Switch 组件构造,这里仅为了演
示分支嵌套情况的代码生成.该模型中的两个 BooleanSwitch 组件会生成嵌套的 if-else 语句(第 4 行、第 7 行、
第 8 行和第 11 行);分段函数的 3 个部分分别生成在这 3 个 if-else 控制的语句块中;最后,SequencePlotter 组件也
由于数据源的不一致会生成在 3 个 if-else 控制的语句块中.
表 2(c)模型输出可以被 3 或 7 整除的数,其中,能同时被 3 和 7 整数的数会被输出两遍.在该模型中,
BooleanSwitch1 和 BooleanSwitch2 组件的 True 和 False 分支分别发生交叉,这会导致 CGLT 中 Display 组件和
接地组件(表示丢弃数据)的分支标记中会有两个分支路径,且这两个分支路径可能会同时满足.因此,这两个分
支总共会有 4 种分支执行情况.但是由于接地组件并不会生成代码,所以这里只生成 3 个 if-else 语句块(第 4 行、
第 6 行和第 8 行).特别地,在 BooleanSwitch1 和 BooleanSwitch2 组件分支都为 True 的情况下,Display 组件会同
时接收来自两个 BooleanSwitch 组件的数据,也就是生成的 printf 代码会输出两个值.
另外,我们对一个更复杂的数据流模型进行代码生成实验,见图 4.该模型不仅仅具有分支合并、分支嵌套、
分支交叉等基本情形,还包含分支嵌套情况下的分支交叉,如图 4 中的 BooleanSwitch1 和 BooleanSwitch2 组件
的 True 分支交叉于 BooleanSwitch3,Expression4 和 Scale1 这 3 个组件前.在数据流语义下,该模型是合法的.该
模型会输出两个函数图像,分别如图 5(a)和图 5(b)所示.模型中的 Sin 组件会以一定采样间隔输出正弦曲线上的
值,由 BooleanSwitch1 和 BooleanSwitch2 组件将正弦曲线分为 3 部分计算.最后,SequencePlotter1 组件会输出计
算后的其中两部分数据,SequencePlotter2 组件会输出计算后的所有 3 部分数据.
Fig.4 A model with more complex branching
图 4 具有更复杂分支情况的模型
(a) 图 4 模型中 SequencePlotter1 输出的图像 (b) 图 4 模型中 SequencePlotter2 输出的图像
Fig.5 Function graph of the model output in Fig.4
图 5 图 4 中模型输出的函数图像