当前位置: 首页 > 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中可表达为注释。

http://www.xdnf.cn/news/29881.html

相关文章:

  • 游戏引擎学习第235天:在 Windows 上初始化 OpenGL
  • 4N60-ASEMI开关电源与适配器专用4N60
  • 6.7 ChatGPT自动生成定时任务脚本:Python与Cron双方案实战指南
  • android测试依赖
  • Python番外——常用的包功能讲解和分类组合
  • GD32H7单片机使用segger_rtt,rtt-viewer看不到输出的问题,怎样解决?
  • 使用docker在manjaro linux系统上运行windows和ubuntu
  • 在统信UOS1060上新增备份到U盘
  • 【java实现+4种变体完整例子】排序算法中【基数排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • Python----深度学习(全连接与链式求导法则)
  • Java中常见的锁synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock
  • MainActivity与RecActivity之间的双向数据传递详解
  • 从 0~1 保姆级 详细版 PostgreSQL 数据库安装教程
  • 数据库备份-docker配置主从数据库
  • k8s安装kubeadm
  • 探索大语言模型(LLM):Transformer 与 BERT从原理到实践
  • 回溯算法(2):全排列问题
  • 基于DeepSeek与Excel的动态图表构建:技术融合与实践应用
  • WebSocket介绍
  • 二级评论列表-Java实现
  • 从零搭建微服务项目Pro(第6-2章——微服务鉴权模块SpringSecurity+JWT)
  • OCR技术与视觉模型技术的区别、应用及展望
  • Python语法系列博客 · 第7期[特殊字符] 列表推导式与字典推导式:更优雅地处理数据结构
  • 使用Redis实现实时排行榜
  • 【Easylive】​​Gateway模块 bootstrap.yml 解析
  • 点云数据处理开源C++方案
  • elementUI中MessageBox.confirm()默认不聚焦问题处理
  • Qt UDP 通信的详细实现步骤和示例代码
  • spring boot应用部署IIS
  • matlab论文图一的地形区域图的球形展示Version_1