重拾《 兩週自制腳本語言 》- Eclipse插件實現語法高亮

源碼庫: 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解析的部分刪去後再也不報錯. 可是, 老文件的錯誤不能自動消除, 應該與內容刷新或者自動校驗有關. 以後對校驗部分定製時進一步研究.函數

參考: Eclipse Content is not allowed in prologthis

相關文章
相關標籤/搜索