Eclipse Xtext 实现PLC ST 语言到C的转换

Eclipse Xtext 是开发领域专用语言(DSL)的工具。例如数据库的SQL 语言,PLC 的ST 语言都是一种领域专用语言。在开放自动化领域,提倡基于模型的设计方法。DSL 是描述模型的强有力工具。

在开发PLC 程序IDE时,开发ST编译器是一项重要的任务,使用的方法大致有两种:

  • 使用 Bison 和Flex
  • 使用Eclipse Xtext

开源PLC项目Beremiz中,使用的就是Bison/Flex.而IEC61499 开源项目4diac 中使用的是Xtext。关于Xtext 实现ST 到C语言转换,我在两年前做过,有一些读者觉得不够详细,最近又将Eclipse Xtext 实现ST 语言转化为C++ 程序的过程做了一遍。供读者参考。其中的语法描述和代码生成是从4diacIDE 移植过来的。

整个过程在Window 下完成。

下载Eclipse Install

官网地址:

Eclipse Downloads | The Eclipse Foundation

运行Eclipse Install

以前介绍Xtext 是Eclipse Modeling Tool 下加Xtext 插件的方式安装Xtext IDE ,现在不需要了,直接选择安装DSL Developers 就可以了。

新建一个xtext项目

新建了xtext 项目之后,回在Eclipse workspace 下建立了4 个项目。

xtext 项目开发的主要工作

描述你打算开发的DSL 语言的语法描述文件。这是一个xtext 的文件

编写代码生成程序,这是一个xtend 文件

运行mwe2

运行DSL 编辑器

这相当于自动生成了一个DSL 的Eclipse IDE。你可以在里面编辑一个xxx.ST 文档,能够高亮关键字等等。

独立的命令行编译程序

我们已经知道,Eclipse Xtext 项目会建立一个针对DSL 的Eclipse IDE。在这个DSL IDE下能够编辑DSL 。但是,有时我们只需要一个独立的命令行编译器(类似于gcc)。Eclipse Xtext 项目能够导出命令行编辑程序。

鼠标指向Main.Java文件 击右键 Run As | Java Application 这时在控制台下会出现"Aborting: no path to EMF resource provided!" 不要担心,因为你没有带任何命令参数。

文件菜单中选择 Export... | Java | Runnable JAR File,然后点击 Next.

按如下设参数

运行

bash 复制代码
PS E:\yao2023\eclipse-workspace> java  -jar STCompiler.jar ./GenericFB.ST
Code generation finished.
PS E:\yao2023\eclipse-workspace>

ST 代码

bash 复制代码
VAR
	X :INT;
	Y:REAL;
	Z:BOOL;
	A:ARRAY[1..12] OF INT;
	i:INT;
END_VAR;
IF Z THEN
	X:=0;
	X:=X*60;
	Y:=sin(3.14156);
ELSIF X>0 THEN 
	X:=10;
ELSE
   X:=10;		
END_IF;
	Z:=TRUE;
	i:=0;
WHILE i<14 DO
	A[i]:=i;
	i:=i+1;
END_WHILE;
	X:=3;
FOR i:=0 TO 12 DO
    X:=X+i;
END_FOR;
CASE i OF
0:i:=1;
1:i:=2;
END_CASE;
RETURN;

翻译的C语言

cpp 复制代码
int X;
double Y;
bool Z;
int A[11];
int i;
if(Z) {
	X = 0;
	X = MUL(X, 60);
	Y = sin(3.14156);
}
else if((X > 0)) {
	X = 10;
}
else {
	X = 10;
};
Z = true;
i = 0;
while((i < 14)) {
  A[i] = i;
  i = ADD(i, 1);
};
X = 3;
for(i = 0;i <= 12;i = i +1){
	X = ADD(X, i);
};
switch (i) {
	case 0:
		i = 1;
		break;
	case 1:
		i = 2;
		break;
}
return;

过程记录难免不全,有问题就问吧!

结束语

最近再次对DSL 感兴趣的原因是本人对自动化行业的信息模型文本描述十分关注。觉得使用DSL 语言描述模型更加有效。

相关推荐
2501_915921431 分钟前
VSCode 写 Swift 运行到 iPhone?快蝎 IDE 开发实战体验
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
u0133945274 分钟前
How to Run sample.war in a Tomcat Docker Container
java·docker·tomcat
splage7 分钟前
Spring Framework 中文官方文档
java·后端·spring
艾莉丝努力练剑13 分钟前
【Linux:文件 + 进程】理解IPC通信
linux·运维·服务器·开发语言·网络·c++·ide
洋不写bug15 分钟前
Java线程(二):线程特点、状态、终止开始控制(
java·开发语言
魑-魅-魍-魉16 分钟前
Stream 中 reversed () 引发 IDE 方法标红的排查方案
ide
sonnet-102920 分钟前
拓扑排序的实现
java·c语言·开发语言·笔记·算法
qq_4338889325 分钟前
IDE中加载不到文件/文件夹/类
ide
不想看见40429 分钟前
Min Stack栈和队列--力扣101算法题解笔记
java·笔记·leetcode