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