源码库: program-in-chinese/stone-editor-eclipse

参考:

续前文重拾《 两周自制脚本语言 》- 中文关键字与原生函数, 开始想在VS Code下实现, 通过添加TextMate语法文件也基本达到了上面的效果, 但看着vscode的Java语法需要上千行JSON代码: java.tmLanguage.json, TypeScript的更夸张有五千行, 难以想象如何维护, 于是考察Eclipse下的实现方式.

正好看到Eclipse 4.7版本之后改进了对新语言的插件开发的支持(Eclipse Project Oxygen (4.7) M3 News), 不用从头建一个定制编辑器, 而是对一个"通用文本编辑器"进行扩展, 来实现高亮, 悬浮提示, 辅助补全等等功能. 看了示例代码以Java为主, 应该比写JSON好维护一些.

刚实现了开头的图示中的高亮功能, 直接上源码.

下面定义了语法高亮的几个规则, 包括数字, 注释(StoneReconciler):

public class StoneReconciler extends PresentationReconciler {
Token 深红 = 字号(SWT.COLOR_DARK_RED);
Token 深绿 = 字号(SWT.COLOR_DARK_GREEN);
Token 蓝色 = 字号(SWT.COLOR_BLUE); public StoneReconciler() {
SingleLineRule 单引号 = new SingleLineRule("'", "'", 深红);
SingleLineRule 双引号 = new SingleLineRule("\"", "\"", 深红);
NumberRule 数字 = new NumberRule(蓝色);
PatternRule 模式规则 = new PatternRule("//", null, 深绿, (char) 0, true); 石头语言用词规则 用词规则 = new 石头语言用词规则(); RuleBasedScanner 扫描器 = new RuleBasedScanner();
扫描器.setRules(new IRule[] {单引号, 双引号, 用词规则, 模式规则, 数字}); DefaultDamagerRepairer 修理器 = new DefaultDamagerRepairer(扫描器);
this.setDamager(修理器, IDocument.DEFAULT_CONTENT_TYPE);
this.setRepairer(修理器, IDocument.DEFAULT_CONTENT_TYPE);
} private Token 字号(int 色号) {
return new Token(new TextAttribute(Display.getCurrent().getSystemColor(色号)));
}
}

关键词高亮规则:

public class 石头语言用词规则 extends WordRule {

  private static final ArrayList<String> 关键字 =
new ArrayList<>(Arrays.asList("每当", "如果", "否则", "类别", "定义")); private static final Color 深紫红 = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_MAGENTA); public 石头语言用词规则() {
super(new 探测器()); for (String 词 : 关键字) {
addWord(词, new Token(new TextAttribute(深紫红, null, SWT.BOLD)));
}
}
}

问题

新建的默认插件对XML进行校验, 因此石头语言的语法会导致文件开头报校验错误"Content is not allowed in prolog". 将ValidatorDocumentSetupParticipant中对XML解析的部分删去后不再报错. 但是, 老文件的错误不能自动消除, 应该与内容刷新或者自动校验有关. 之后对校验部分定制时进一步研究.

参考: Eclipse Content is not allowed in prolog

重拾《 两周自制脚本语言 》- Eclipse插件实现语法高亮的更多相关文章

  1. 实现自己的脚本语言ngscript之三:语法设计

    这是第四篇了,之所以隔了这么久才写,一方面是因为最近开始实习了,另一方面是因为设计语法真是要考虑很多东西. 于是我去读了这本书,里面实现了两种语言,一种跟js差不多语法,用ast解释执行:另一种语法类 ...

  2. 重拾c++第一天(2):基本语法

    1.输出方法: cout<<"输出语句" 2.输出时换行为 cout<<endl or "\n" 3.连续赋值是合法的,从右往左依次赋值 ...

  3. Notepad++ - 通过语言格式设置自定义语法高亮颜色

    http://blog.csdn.net/onceing/article/details/51554399 Global Styles Indent guideline style  缩进参考线的颜色 ...

  4. 演示Eclipse插件实现代码提示和补全

    续上文重拾< 两周自制脚本语言 >- Eclipse插件实现语法高亮, 但仅达到了演示Eclipse本身功能的程度, 与石头语言并无直接联系. 源码库相同, 仍在同一插件. 演示效果如下: ...

  5. freemarker编辑器eclipse插件

    freemarker编辑器eclipse插件 支持语法高亮,语法校验,代码提示的工具 freemarker  IDE(JBoss): http://download.jboss.org/jbossto ...

  6. 【C语言】 重拾

    [C语言] 因为以前学过C语言,只不过太长时间不用,已经忘得差不多了… 所以这篇文章的性质是把C语言中一些对于现在的我不是很符合预期的知识点记录一下. ■ HelloWorld程序 HelloWorl ...

  7. java+win7+eclipse+Maven+sikuli 配置总结---图形脚本语言

    简介:Sikuli 是一种新颖的图形脚本语言,或者说是一种另类的自动化测试技术.它与我们常用的自动化测试技术(工具)有很大的区别. 关于配置,一直是一个问题,下面做个总体介绍,用sikuli也有几个月 ...

  8. 微信小程序wxml页面toFixed保留两位小数,wxs脚本语言

    在wxml页面执行toFixed函数的时候发现失效,在微信小程序的js页面是生效的,但是我不希望在data中保留这些额外的数据,于是找到了下面这种解决方案wxs脚本语言. <wxs module ...

  9. 如何两周达到150行Java程序的能力--part 1

    面向对象程序先导课是体系化面向对象课程的重要组成部分,其目标是帮助那些有一定C语言基础,但对面向对象概念陌生,基本没碰过Java编程的同学.该课程设计为暑期选修课,因为没有其他课程,我们设计为现场训练 ...

随机推荐

  1. mysql数据库NO CONNECTION问题分析以及解决方案

    自己的站点有时候会挂掉,着实比较麻烦,我不会24小时都看着,说多的都是泪 出现mysql出现NO CONNECTION 有可能原因:mysql服务出现问题 解决方案:重启mysql服务,数据库就连接上 ...

  2. 基于async/non-blocking高性能redis组件库BeetleX.Redis

    BeetleX.Redis是基于async/non-blocking模式实现的高性能redis组件库,组件支持redis基础指令集,并封装更简便的List,Hashset和Subscribe操作.除了 ...

  3. 我们必须要知道的RESTful服务最佳实践

    看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标 ...

  4. 我的秋招经验分享(已拿BAT头条网易滴滴)

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  5. EIGRP 基础实验

    一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1.掌握EIGRP 的基本配置 2.掌握EIGRP 的通配符掩配置方法 3.掌握EIGRP 的自动汇总特性,理解E ...

  6. MD5加密Util

    目录 (1)需要导入的包 (2)MD5Util类 (3)使用举例 (1)需要导入的包 <dependency> <groupId>org.apache.commons</ ...

  7. box-decoration-break属性

    box-decoration-break属性可以指定元素片段在跨行.跨列或跨页(如打印)时候的样式渲染表现.默认情况下,元素的跨行或跨列渲染都是裁剪分割,各得一部分.举个例子<div class ...

  8. GridView 的简单应用

    gridView 是android一个控件主要是显示列似与九宫格这样的效果.废话不多说直接上代码. 首先是需要一个适配器来确定每一个里面的布局,在里面我自定义了一个点击事件,当点击图片布局的时候触发, ...

  9. [Android 除錯] Conflict with dependency

    Android Studio build 時的錯誤訊息 : Conflict with dependency 詳細錯誤訊息 : Conflict with dependency 'com.androi ...

  10. c/c++ 网络编程 陈硕老师视频理解之ttcp

    ttcp 是干啥的:测试2台机器间的网络传输性能 wiki 功能如下图: 对应的视频是: 4.回顾基础的Sockets API.mkv 5.TTCP代码概览.mkv 6.使用TTCP进行网络传输性能测 ...