Scade 语言词法介绍
Scade 6 是一种具备形式化语法与形式化语义的领域特定语言(注1)。自2008年发布(注5)起,在 Scade Suite 产品系列中语言定义方面到目前未产生重要的改变(注2)。在下面的内容中将介绍Scade 语言的词法(注3)。
注1:在巴黎高师课程《同步反应式系统》中,在第一节课"使用Lustre面向嵌入式系统编程"相关的参考材料
TASE 2017
中提到了Scade语言语法及语义具备形式化定义的特点。
注2:2024年发布的下一代Scade产品
Scade One
中,虽然新语言Swan
为Scade 6
的拓展,但由于其并不作为Scade Suite
产品的内容,因此仍可认为Scade Suite
中的语言技术没有变化。
注3: 详细内容可参考scade suite student 2025R1。
注5:
Scade 6
发布时间可参考 Scade 在 ERTS 2008 发布的SCADE 6: 面向高安全软件开发的基于模型的解决方案
词法概念
词法规则(lexical rule)是编程语言中的概念,定义如何将源代码的字符序列(字符串)转换为一系列有意义的基本单元(称为 词法记号,Token)的规则。这一过程被称为 词法分析(Lexical Analysis),由词法分析器完成。
词法规则与语法规则的区别
这里需要补充词法概念与语法概念的区别。在一些解析器生成工具,比如"ocamllex + menhir"、"flex + bison"之类的技术组合中,词法规则(.l
)与语法规则(.y
)由不同的描述构成。需要注意两者概念的区别:
- 词法规则:关注字符如何组成基本单元(Token),属于语言的“单词”层面。
- 语法规则(syntax rule):定义 Token 如何组合成合法的程序结构(如表达式、语句),属于“句子”层面。例如,语法规则会检查
if (x > 0)
是否符合条件语句的结构,而词法规则仅确保if
、(
、x
等被正确识别为 Token。
Scade 语言词法规则
Scade 6 的词法可参考 Scade Suite 相关文档的描述(注4)。其中,主要部分包括关键字列表、特殊符号列表、正则表达式描述的词素、注释与pragma的形式定义等。
注4:ANSYS SCADE Suite学生版 安装后,随附文档中的语言参考材料中描述了语言词法。
关键字列表
对关键字列表部分的词法规则,描述的是在Scade 语言中作为特殊关键字的词。比如下面部分Scade关键字的flex 词法定义:
...
flatten { return FLATTEN; }
map { return MAP; }
fold { return FOLD; }
mapi { return MAPI; }
foldi { return FOLDI; }
...
描述了 flatten
, map
, fold
, mapi
, foldi
在Scade语言中作为关键字。
特殊符号列表
特殊符号列表部分的词法规则,描述的是Scade语言中作为特殊符号的token。比如下面为部分Scade特殊符号的flex 词法定义:
...
">>" { return DOUBLE_GT; }
"," { return COMMA; }
"{" { return L_BRACE; }
"}" { return R_BRACE; }
...
以上部分描述了>>
, ,
, {
, }
在Scade语言中作为特殊符号token对待,并在词法中命名了相应的标识名字。
正则表达式描述的词素
对正则表达式描述的词素,如下面的flex词法定义片段:
...
INTEGER10 (0|[1-9]{DIGIT10}*)
INTEGER16 0x{DIGIT16}+
...
上面的词法规则描述了Scade中十进制数和十六进制数的表达形式。
注释等内容的词法
对注释等内容的Scade词法描述,如下面的flex词法所示
...
"/*" { BEGIN(COMMENT); }
<COMMENT>{\*"/" { BEGIN(INITIAL); } .|\n
}"--".*
...
描述了/* ... */
与 -- ...
的形式,在Scade中可表达为注释。