Page 97 - 《软件学报》2025年第9期
P. 97

4008                                                       软件学报  2025  年第  36  卷第  9  期



                    var  ::= id|id[ra]|id[ra 1 ][ra 2 ]|la.var| pt → var

                    pt   ::= la|&|(τ)ra|ra 1 +ra 2 |ra 1 −ra 2 |ext g(ra 1 ,...,ra n )|ext h(ra 1 ,...,ra n ,RVal)

                    la   ::= var|∗ pt

                    ra   ::= c|la|&|(τ)ra|mop 1 ra|ra 1 mop 2 ra 2 |if (b) then ra 1 else ra 2 |⊝ra|ext g(ra 1 ,...,ra n )|ext h(ra 1 ,...,ra n ,RVal)

                    mop 1 ::= +|−| ∼

                    mop 2 ::= +|−|∗| |%| ≪ | ≫ |&|| | ∧

                    b    ::= true|false|ra 1 mrop ra 2 |¬b|b 1 ∧b 2 |b 1 ∨b 2

                    mrop ::=< | > | <= | >= | = |! =
                 其中,  var、  id 为变量,  pt 为指针表达式,  τ 为类型,  (τ)为类型转化 la 为左值表达式,      ra 为右值表达式    ⊝ra 表示前
                                                                   ,
                 一状态   ra 的值,  mop 1  为一元操作符,  mop 2  为二元操作符,  b 为布尔表达式,   mrop 为关系操作符,     ext g(ra 1 ,...,ra n )
                   ext h(ra 1 ,...,ra n ,RVal) 均表示外部调用,  g 表示外部函数,  h 表示用户自定义函数.
                 与
                    下面介绍    MSVL  的基本语句:
                    (1) 区间长度语句:    empty,skip,len(n);
                    (2) 区间框架语句:    frame(x);
                    (3) 并行语句:  p||q;
                    (4) 顺序语句:  p;q;
                    (5) 非确定选择语句:     p or q;
                    (6) 合取语句:  p and q;
                    (7) 等待语句:  await(b);
                    (8) 立即赋值语句:    x ⇐ e;
                    (9) 下一状态赋值语句:     x := e;
                    (10) Always 语句:  alw(p);
                    (11) Next 语句:  next p;
                    (12) 循环语句:  while(b) p;
                    (13) 条件语句:  if (b)then p else q;
                    (14) 投影语句:  (p 1 ,..., p m ) prj q;
                    (15) 函数调用语句:    fun(e 1 ,...,e n );
                    (16) 外部函数调用语句:     ext fun(e 1 ,...,e n );
                 其中,  x 为变量,  e 为算数表达式,   b 为布尔表达式,    p 1 ,..., p m , p,q 为  MSVL  语句.
                                empty,skip,len(n) 分别声明了当前区间长度为                              q 在当前状态下
                    区间长度语句                                          0, 1, n; 并行语句  p||q 表明   p 与
                 同时开始执行, 并有可能在不同时间结束; 非确定选择语句                 p or q 表示在当前状态下可以执行       p 或  q 中的任意一个;
                 顺序语句    p;q 表示   p 与   q 按照顺序执行; 合取语句   p and q 表示  p 与  q 在当前状态下同时开始执行并同时结束; 等
                      await(b) 将会循环判断表达式      b  的真假, 直到  b                         x ⇐ e 与下一状态赋值语句
                 待语句                                       为真时结束循环; 立即赋值语句
                                                                                     p next p 表示在下一状态
                 x := e 分别表示在当前状态和下一状态对变量进行赋值;               alw(p) 表示在所有状态下执行  ;
                 执行  ;         ,                                                               不仅包含赋
                     p while(b) p if (b)then p else q 以及函数调用语句的用法与其他高级程序设计语言相同. MSVL
                 值语句、循环语句、条件判断语句等基本语句, 还加入了框架结构和投影结构, 为描述软硬件系统提供了更强的
                 表达能力, 区间框架语句       frame(x) 使得变量   x 的值能够在区间上自动遗传, 否则变量           x 仅在被赋值时的状态下有
                                                                                        q
                 确定的值, 在其他状态下变量值是不确定的; 投影语句                   (p 1 ,..., p m ) prj q  使得  p 1 ,..., p m  与   能够并行执行, 且
                 p 1 ,..., p m  顺序执行, 而  q  在另一个状态区间上执行.

                 1.2   MSVL  操作语义
                    定义  MSVL  程序  P m  的格局为四元组    (P m ,σ i−1 , s i ,i), 其中区间  σ i−1  记录了  < s 0 ,..., s i−1 > 中所有状态的信息,   s i
   92   93   94   95   96   97   98   99   100   101   102