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 语言描述模型更加有效。

相关推荐
宠..7 分钟前
VS Code 修改 C++ 标准同时修改错误检测标准
java·linux·开发语言·javascript·c++·python·qt
WL_Aurora8 分钟前
Java Scanner输入陷阱深度解析
java·开发语言
一只大袋鼠13 分钟前
SpringMVC 框架中的拦截器
java·springmvc·javaweb·拦截器
Han_han91913 分钟前
斗地主案例:
java·开发语言
阿丰资源15 分钟前
基于SpringBoot的电影评论网站(含源码)
java·spring boot·后端
小码哥06816 分钟前
2026版基于springboot的家政服务预约系统
java·spring boot·后端
安大小万21 分钟前
VSCode的json文件不允许注释的解决办法
ide·vscode·编辑器
xuhaoyu_cpp_java22 分钟前
SpringMVC学习(三)
java·经验分享·笔记·学习·spring
小谢小哥24 分钟前
59-消息推送系统详解
java·后端·架构
逻辑驱动的ken24 分钟前
Java高频面试考点场景题30
java·开发语言·深度学习·面试·职场和发展