源碼庫: program-in-chinese/stone-editor-eclipsejava
參考:git
續前文重拾《 兩週自制腳本語言 》- 中文關鍵字與原生函數, 開始想在VS Code下實現, 經過添加TextMate語法文件也基本達到了上面的效果, 但看着vscode的Java語法須要上千行JSON代碼: java.tmLanguage.json, TypeScript的更誇張有五千行, 不可思議如何維護, 因而考察Eclipse下的實現方式.github
正好看到Eclipse 4.7版本以後改進了對新語言的插件開發的支持(Eclipse Project Oxygen (4.7) M3 News), 不用從頭建一個定製編輯器, 而是對一個"通用文本編輯器"進行擴展, 來實現高亮, 懸浮提示, 輔助補全等等功能. 看了示例代碼以Java爲主, 應該比寫JSON好維護一些.json
剛實現了開頭的圖示中的高亮功能, 直接上源碼.eclipse
下面定義了語法高亮的幾個規則, 包括數字, 註釋(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(色號))); } }
關鍵詞高亮規則:ide
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解析的部分刪去後再也不報錯. 可是, 老文件的錯誤不能自動消除, 應該與內容刷新或者自動校驗有關. 以後對校驗部分定製時進一步研究.函數