2018-01-19 Xtext试用: 5步实现一个(中文)JVM语言
2024-09-27 01:15:26
续上文Xtext试用: 快速实现简单领域专用语言(DSL). 基于官方教程: Five simple steps to your JVM language
达成如下语言:
它被Quan6JvmModelInferrer中的转换生成Java源代码(与上文中的代码生成不同的是, 不需要写出具体Java语法).
项目源码在: program-in-chinese/xtext_tutorial_15_min_zh, 只包含了语法规则所在项目. 其他项目(.ide, .tests, .ui.tests等等, 也不知何用)未提交. 测试项目(包括上图的代码)在: program-in-chinese/xtext_tutorial_15_min_zh
由于本人创建的项目名称与教程不同(com.program_in_chinese.quan6), 运行后打开DSL源码文件时报错:
An internal error occurred during: "XtextReconcilerJob".
java.lang.IllegalArgumentException: Domainmodel.importSection does not exist
后发现语法规则的命名空间应该修改为自定义的(本文用的Quan6, 而非教程中的Domainmodel). 顺便将关键词汉化了, 标识符支持中文(IDENTIFIER等), 更新后的语法规则如下:
grammar com.program_in_chinese.quan6.Quan6 with org.eclipse.xtext.xbase.Xbase
generate quan6 "http://www.program_in_chinese.com/quan6/Quan6"
Quan6:
importSection=XImportSection?
elements+=AbstractElement*;
AbstractElement:
PackageDeclaration | Entity;
PackageDeclaration:
'包' name=QualifiedName '{'
elements+=AbstractElement*
'}';
Entity:
'类' name=ValidID ('扩展' superType=JvmTypeReference)? '{'
features+=Feature*
'}';
Feature:
Property | Operation;
Property:
name=ValidID ':' type=JvmTypeReference;
Operation:
'函数' name=ValidID
'('(params+=FullJvmFormalParameter
(',' params+=FullJvmFormalParameter)*)?')'
':' type=JvmTypeReference
body=XBlockExpression;
@Override
ValidID:
IDENTIFIER;
terminal IDENTIFIER:
'^'?('\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D'|'a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'\u4E00'..'\u9FA5'|'\uF900'..'\uFA2D')*;
其中不少xbase支持的规则如XBlockExpression, 就是Java块, 如:
{
return "Hello World" + "!"
}
小结
这个教程中演示的语法定制程度似乎有限, 在深入学习xtext语法规则描述语言(The Grammar Language)和xbase之前, 还不能确认能够支持多么自由的语法定义. 但暂时没想到什么肯定能不到的语法规则(未把不带空格语法考虑在内). 感觉工具的一些错误反馈信息不那么易懂, 使用过程中感觉不那么结实. 但至少应该可以用于语言原型的快速开发.
最新文章
- 1Z0-053 争议题目解析697
- Json解析工具Jackson(使用注解)
- ubuntu使用doxygen
- HTML网页内容转换成字符串(删除从指定字符串到指定字符串)
- PHP文件操作 读取与写入
- 转: js操作cookie
- [AngularJS] ui-router: named views
- jmap命令
- smarty练习:考试系统
- HashMap源码解读(转)
- POJ 3047 Bovine Birthday 日期定周求 泽勒公式
- CentOS 7安装Docker
- PHP访问连接MYSQL数据库
- Java中的集合概述
- Flask中的before_request after_request
- TCP中的KeepAlive与HTTP中的Keep-Alive
- 10.2-uC/OS-III内部任务管理(任务状态)
- StringTie用法详解
- 构建之法——Team &; Scrum &; MSF
- 小学四则运算APP 第一阶段冲刺 第二天-补
热门文章
- 由百度 “PHP薪资” 引发的思考
- 利用Burp Suite攻击Web应用
- Eclipse 中 Java 代码报版本错误的问题
- LeetCode--No.004 Median of Two Sorted Arrays
- Mongodb 无法启动 windows Mongodb 无法启动 couldn't connect to server
- Python:SQLMap源码精读—start函数
- (转)10大H5前端框架
- Hibernate框架 主配置文件(Hibernate.cfg.xml)基本
- MySQL数据库设计规范
- Jenkins之使用Pyinstaller构建Python应用程序