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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
程序中算钱不能用浮点类型是个什么坑?
阅读本文大概需要 1 分钟。 先来考考大家,在下列 Java 代码中,你觉得在控制台会打印什么值呢? 貌似难不倒大家,这不是 so easy ,连小学生都会算的题目,1.0 - 0.9 = 0.1 啊,但是你觉得会等于 0.1 吗? 看下上图代码的输出结果: 有没有惊讶,有没有很刺激,0.0……02 难道被计算机吃掉了??? 好吧,当初我也是这幅表情(原谅我基础薄弱)。 那如果我们将其换成 float 类型的会怎么样呢?再来试试。 控制台打印结果: 结果居然多了 0.10…24,那不得乐开花啊~ 那么以上这些现象是为什么呢? 浮点数在计算机中采用二进制表示,而二进制系统无法精确表示某些小数,比如 1/10 ,就像十进制无法表示 1/3 一样,这样是产生误差的原因。 在企业开发中,当涉及到钱的计算时应该使用 BigDecimal 类型来处理,尤其是在金融领域,只要和钱有关的任何逻辑,都是大事,反之没那么严重(只是没那么大)。 ·END· 程序员的成长之路 路虽远,行则必至
- 下一篇
2018-02-16 中文代码示例之冒泡算法, 后感
以前探讨过中文命名在业务部分的优势大于算法部分. 今天又一次看到了这个以冒泡算法的例子: 刘然:批判易语言的人是否用过这门语言,批判它的原因又是什么?有些感触. 先尝试对变量命名进行改进, 来看看是否会有不同观感. 注: 本文不讨论输入效率问题, 也不讨论易语言 时间太有限, 仅对帖子中的Python程序作粗浅探讨. 另一个易语言语法的例程也有不同方面的改进空间, 就不展开了. 有兴趣/质疑的欢迎提其他例程一同探讨. for i in xrange(len(a)): for j in xrange(i + 1, len(a)): if a[i] > a[j]: a[i], a[j] = a[j], a[i] 首先, 在嵌套循环中使用i和j的一个问题是, 两者看起来有点像. 下面的视觉区分度更大: for 甲 in xrange(len(a)): for 乙 in xrange(甲 + 1, len(a)): if a[甲] > a[乙]: a[甲], a[乙] = a[乙], a[甲] 也可以赋予变量名以更多语义, 来凸显变量的某些性质, 如下. 而英文命名想要表达类似语义...
相关文章
文章评论
共有0条评论来说两句吧...