经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » Eclipse » 查看文章
重拾《 两周自制脚本语言 》- Eclipse插件实现语法高亮
来源:cnblogs  作者:吴烜  时间:2019/3/22 8:57:14  对本文有异议

源码库: 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):

  1. public class StoneReconciler extends PresentationReconciler {
  2. Token 深红 = 字号(SWT.COLOR_DARK_RED);
  3. Token 深绿 = 字号(SWT.COLOR_DARK_GREEN);
  4. Token 蓝色 = 字号(SWT.COLOR_BLUE);
  5. public StoneReconciler() {
  6. SingleLineRule 单引号 = new SingleLineRule("'", "'", 深红);
  7. SingleLineRule 双引号 = new SingleLineRule("\"", "\"", 深红);
  8. NumberRule 数字 = new NumberRule(蓝色);
  9. PatternRule 模式规则 = new PatternRule("//", null, 深绿, (char) 0, true);
  10. 石头语言用词规则 用词规则 = new 石头语言用词规则();
  11. RuleBasedScanner 扫描器 = new RuleBasedScanner();
  12. 扫描器.setRules(new IRule[] {单引号, 双引号, 用词规则, 模式规则, 数字});
  13. DefaultDamagerRepairer 修理器 = new DefaultDamagerRepairer(扫描器);
  14. this.setDamager(修理器, IDocument.DEFAULT_CONTENT_TYPE);
  15. this.setRepairer(修理器, IDocument.DEFAULT_CONTENT_TYPE);
  16. }
  17. private Token 字号(int 色号) {
  18. return new Token(new TextAttribute(Display.getCurrent().getSystemColor(色号)));
  19. }
  20. }

关键词高亮规则:

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

问题

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

参考: Eclipse Content is not allowed in prolog

原文链接:http://www.cnblogs.com/program-in-chinese/p/10570093.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号