续上文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之前, 还不能确认能够支持多么自由的语法定义. 但暂时没想到什么肯定能不到的语法规则(未把不带空格语法考虑在内). 感觉工具的一些错误反馈信息不那么易懂, 使用过程中感觉不那么结实. 但至少应该可以用于语言原型的快速开发.

2018-01-19 Xtext试用: 5步实现一个(中文)JVM语言的更多相关文章

  1. 2018-01-19 Xtext试用: 快速实现简单领域专用语言(DSL)

    环境搭建 使用的Eclipse版本: Oxygen.1a Release (4.7.1a) Build id: 20171005-1200, 通过添加Xtext - Download上列出的Relea ...

  2. IDC Digital Transition Annual Festival(2018.10.19)

    时间:2018.10.19地点:北京万达文化酒店

  3. 2018.10.19浪在ACM 集训队第一次测试赛

    2018.10.19浪在ACM 集训队第一次测试赛 待参考资料: [1]:https://blog.csdn.net/XLno_name/article/details/78559973?utm_so ...

  4. 20172319 2018.10.19《Java程序设计教程》第7周课堂实践(补写博客)

    20172319 2018.10.19 <Java程序设计教程>第7周课堂实践 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  5. AI Summit(2018.07.19)

    AI Summit 时间:2018.07.19地点:北京丽都皇冠假日酒店

  6. IDEA(2018.01)安装和破解

    IDEA(2018.01)安装和破解 1.下载IDE https://www.jetbrains.com/idea/download/#section=windows 选择Ultimate版本 2.下 ...

  7. Linux强化论:15步打造一个安全的Linux服务器

    Linux强化论:15步打造一个安全的Linux服务器 Alpha_h4ck2016-11-30共28761人围观 ,发现 8 个不明物体专题系统安全 可能大多数人都觉得Linux是安全的吧?但我要告 ...

  8. [Angularjs] 第一步开始一个项目

    [Angularjs] 第一步开始一个项目 一.什么是angularjs angularjs是2009年兴起的,目前由Google维护一个采用mvc模式的js框架,很多时候用来创建单页面应用.我也经常 ...

  9. 零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸)

    原文:零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸) 本篇内容会教你如何使用笔刷.钢笔.渐层以及透明度的调整,还有如何转化图层和路径,最重要的是要 ...

随机推荐

  1. 使用CGlib出现java.lang.NoClassDefFoundError: org/objectweb/asm/Type异常

    在学习使用CGlib生成动态代理对象,项目的源代码也很简单: package proxy; import java.lang.reflect.Method; import net.sf.cglib.p ...

  2. cad.net 利用win32api实现一个命令开关参照面板

    首先我要判断是否已经打开了参照面板. 然而cad自己没有相关的系统变量.这时我就需要利用到win32api来判断程序是否打开了参照面板了. 首先学习的是 https://blog.csdn.net/b ...

  3. Javascript高级编程学习笔记(12)—— 引用类型(1)Object类型

    前面的文章中我们知道JS中的值分为两种类型 基础类型的值和引用类型的值 基础类型的值我已经大概介绍了一下,今天开始后面几天我会为大家介绍一下引用类型的值 Object类型 对象是引用类型的值的实例,在 ...

  4. Swift5 语言指南(十三) 方法

    方法是与特定类型相关联的函数.类,结构和枚举都可以定义实例方法,这些方法封装了用于处理给定类型的实例的特定任务和功能.类,结构和枚举也可以定义类型方法,它们与类型本身相关联.类型方法类似于Object ...

  5. 往github提交代码流程

    一 首先在Github新建一个仓库,回到首页,点击右上角的New repository新建仓库. 二  在本地依次使用下面命令 …or create a new repository on the c ...

  6. 【leetcode】20.有效的括号

    题目 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.有效字符串需满足:左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可被认为 ...

  7. Ubuntu 16.04下安装谷歌浏览器(转)

    1.进入 Ubuntu 16.04 桌面,按下 Ctrl + Alt + t 键盘组合键,启动终端. 2.在终端中,输入以下命令,将下载源加入到系统的源列表. sudo wget http://www ...

  8. mysql修改数据路径

    步凑: 1.关闭mysql服务 [root@localhost /]# service mysqld stop 2.移动mysql文件夹到自定义的目录 [root@localhost /]# mv / ...

  9. 关于jQuery的一些东西

    1.jQuery的选择器学习     基本选择器        id选择器            $("#id名") 返回的是存储了指定的HTML元素对象的数组        标签 ...

  10. 安装mysql.zip文件教程(包含常见问题修复)

    参考链接: https://jingyan.baidu.com/article/63f236284aca280208ab3dcc.html https://jingyan.baidu.com/arti ...