在 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