在 Scade 6 程序中自定义算子(Operator)的定义、或数据流定义(data_def)的内容中,包含一种基本的语言结构:方程(equation)(注1)。在本篇中,将叙述 Scade 语言方程的文法形式,以及作用。
注1: 对 Scade 中的 equation, 或 equation set,在部分中文材料中翻译为等式与等式集。这里选择“方程”作为Scade 语言“equation”的翻译是考虑到:a) Scade 推出时面向的用户群为通常使用块状图形式编写自动控制算法的控制工程师,而在该领域,equation 与 equation set 的含义更倾向于方程与方程组。b) 在 ENS《同步反应式系统》课程中,在引出 Lustre 语言时,也是以“联立方程组有唯一解”的例子来引出同步数据流语言,因此 equation 与方程概念接近。c) Lustre 的主要设计者之一 Paul Caspi 的背景来自自动控制领域,其在设计 Lustre 时使用 equation 概念,更有可能指代方程。
方程的文法形式
方程在 Scade 6 文法中的定义如下:
equation ::= simple_equation| assert| emission| control_block return
在 Scade 文法中,对方程概念的含义进行了拓展,含义除了传统意义上的简单方程外,将断言语句、信号发射、控制块结构(状态机、条件块、匹配块)等也归类为方程的生成式(Production)组成。为了专注于方程的原生定义,本篇仅讨论“simple_equation”的生成形式。
"simple_equation"的文法形式如下:
simple_equation ::= lhs = expr
在内容组成方面,由等号左侧的部分(lhs, left hand side)与等号右侧的表达式构成。lhs 可以是 Scade 6 中合法的标识符列表或占位符,其文法形式如下
lhs ::= ( )| lhs_id {{ , lhs_id }}
lhs_id ::= ID| _
而表达式则为语言支持的表达式结构,在这里不作展开,仅列出表达式(expr)的顶层文法生成式
expr ::= id_expr
| atom
| list_expr
| tempo_expr
| arith_expr
| relation_expr
| bool_expr
| array_expr
| struct_expr
| mixed_constructor
| switch_expr
| apply_expr
例子
下面是 Scade 6 语言的片段
function caseOp(ival1, ival2, ival3, ival4: int8) returns (o: int8)o = (case ival1 of | 1: ival2 | 2: ival3 | _: ival4);
其中,o = (case ival1 of | 1: ival2 | 2: ival3 | _: ival4)
为方程。等号左侧的"o"为"lhs",等号右侧的(case ival1 of | 1: ival2 | 2: ival3 | _: ival4)
为 list_expr
列表表达式(因为包含在"()"中)。
方程的使用场景
equation 在 Scade 6 可在如下场景中使用,比如自定义算子的定义体中:
opt_body ::= ;| equation ;| [[ signal_block ]][[ local_block ]]let {{ equation ; }} tel [[ ; ]]
或在数据流定义(dataflow definition)中:
data_def ::= equation ;| scope