重拾《 两周自制脚本语言 》- Eclipse插件实现语法高亮
源码库: program-in-chinese/stone-editor-eclipse
参考:
- FAQ How do I write an editor for my own language?
- Deliver support for new languages in Eclipse IDE faster with Generic Editor and Language Servers - Red Hat Developer Blog
- Vogella公司写的源码例子: vogellacompany/codeexamples-ide
续前文重拾《 两周自制脚本语言 》- 中文关键字与原生函数, 开始想在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
2019-03-20
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
阿里云AMQP PHP使用示例
概述 本文主要介绍如何通过 PHP SDK 连接阿里云AMQP服务。 测试过程 1、composer.json { "require" : { "php-amqplib/php-amqplib" : "^2.9" }, "require-dev" : { "phpunit/phpunit" : "^5" } } 2、send code <?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; include("AliyunCredentialsProvider.
- 下一篇
论JVM爆炸的几种姿势及自救方法
前言 如今不管是在面试还是在我们的工作中,OOM总是不断的出现在我们的视野中,所以我们有必要去了解一下导致OOM的原因以及一些基本的调整方法,大家可以通过下面的事例来了解一下什么样的代码会导致OOM,帮助我们以后在工作中能够通过异常信息来判断是JVM里面哪个区域出现了问题。 先介绍一下笔者的相关编码环境。 jdk:java version "1.8.0_121" ide:IntelliJ IDEA 2019.1 (Community Edition) 正文 1.Java堆溢出 Java中的堆存储的都是对象实例,当我们不断的创建对象,而GC的时候又不能回收,当存储的对象大小超过了-Xmx的值,这时候则会出现OutOfMemoryError.[-XX:+HeapDumpOnOutOfMemoryError]参数可以让jvm出现内存溢出的时候dump出内存堆转储快照。 /** * VM Args: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError * @author wangzenghuang */ public class HeapOOMDem...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境