当前位置: 首页 > news >正文

Scade 语言词法介绍

Scade 6 是一种具备形式化语法与形式化语义的领域特定语言(注1)。自2008年发布(注5)起,在 Scade Suite 产品系列中语言定义方面到目前未产生重要的改变(注2)。在下面的内容中将介绍Scade 语言的词法(注3)。

注1:在巴黎高师课程《同步反应式系统》中,在第一节课"使用Lustre面向嵌入式系统编程"相关的参考材料TASE 2017中提到了Scade语言语法及语义具备形式化定义的特点。

注2:2024年发布的下一代Scade产品Scade One中,虽然新语言SwanScade 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中可表达为注释。

相关文章:

  • 4.17--4.19刷题记录(贪心)
  • RTMP握手流程
  • 完整游戏排行榜系统实现
  • Opentelemetry 项目解读
  • 3. 进程概念
  • 点灯大师(第一步)
  • I/O多路转接之select、poll、epoll详解
  • JS中实现类似sleep、wait、delay的延时功能
  • 【今日三题】打怪(模拟) / 字符串分类(字符串哈希) / 城市群数量(dfs)
  • javaSE.判空包装类
  • Vue基础(6)_键盘事件
  • Kubernetes相关的名词解释CoreDNS插件(2)
  • C++——异常
  • RBAC的使用
  • 深入解析 JDK jstack 命令:线程分析的利器
  • CUDA编程中影响性能的小细节总结
  • Java PrintStream 类深度解析
  • 【AI提示词】经济学家
  • Pandas数据统计分析
  • 洛谷的几道题(2)
  • 北理工再通报:开除宫某党籍,免去行政职务,解除聘用关系
  • 恒安集团创始人许连捷逝世:白手起家缔造百亿纸品巨头,个人曾捐赠超10亿
  • 同比增长4.2%!一季度全国财政支出持续增长
  • 一季度江西GDP达7927.1亿元,同比增长5.7%
  • 国家统计局:要全面客观看待近期价格的低位运行,具有明显的阶段性和结构性特点
  • 西藏旅游:2024年营业收入2.13亿元,出入境商旅业务激增378%