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.

  按如下设参数
  

运行

PS E:\yao2023\eclipse-workspace> java  -jar STCompiler.jar ./GenericFB.ST
Code generation finished.
PS E:\yao2023\eclipse-workspace>

 ST 代码

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语言

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Xtext是一个用于创建领域专用语言(Domain Specific Language,DSL)的开发框架,它可以通过定义自定义语法规则来生成语言编辑器和编译器。通过使用Xtext,开发人员可以为特定领域创建一种自定义的语言,并且随后可以轻松地创建基于该语言的编辑器。 对于自定义语法规则,Xtext提供了一种类似于BNF(巴科斯范式)的语法定义语言。通过这种语法,我们可以描述语言的关键字、语法结构、数据类型和规则等。以下是一个简单的示例: 1. 定义关键字和数据类型: program: 'program' name=ID; 2. 定义变量声明和赋值语句: // 变量声明 variableDeclaration: 'var' name=ID ':' type=DataType; // 赋值语句 assignmentStatement: variable=[VariableDeclaration] '=' value=INT; 3. 定义条件语句: ifStatement: 'if' condition=Expression 'then' statement=Statement 'else' statement=Statement; 4. 定义表达式: Expression: additiveExpression; additiveExpression: multiplicativeExpression ('+' multiplicativeExpression)*; multiplicativeExpression: primaryExpression ('*' primaryExpression)*; primaryExpression: INT | ID; 上述示例中,我们定义了一个DSL的基本语法规则,包括程序声明、变量声明和赋值语句、条件语句以及表达式等。通过这些语法规则,Xtext可以为我们创建一个针对特定领域的自定义语言编辑器,并提供语法高亮、代码提示和错误检查等功能。 总之,Xtext提供了一种简单而灵活的方式来定义自定义语法规则,通过使用这些规则,我们可以轻松地创建具有语法分析、语法高亮等功能的领域特定语言编辑器。它可以大大提高开发人员在特定领域的工作效率和代码质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值