Scintilla icon Scintilla と SciTE に解析器を加えるAdd a lexer to Scintilla and SciTE

解析器の追加 Lexer addition.

Scintilla と SciTE の双方に新しい解析器を加える手順の道程は短くありません。Apache の CONF ファイル解析器を SciTE に追加する方法についての私の回答をここで紹介します。解析器のコードを核に当たって(step 4 と 5)、情報がさらに Scintilla の解説書にあります。

The process of adding a new lexer to both Scintilla and SciTE is fairly long. Here is my response when asked how to add a lexer for Apache CONF files to SciTE. There is more information on writing the lexer code (steps 4 and 5, here) in the documentation for Scintilla.

設定の手順が煩わしくないように、六つ全ての makefile を使わなくてもいいようになっています。解析器を寄贈してもらえる場合は、私が後ほど修正・合成を行います。

Don't bother about steps which are for configurations you don't use all 6 makefiles - I'll patch them up later if you want to contribute the lexer.

  1. scintilla/include/Scintilla.iface に解析器識別番号を加えてください。
    val SCLEX_CONF=17
    In scintilla/include/Scintilla.iface, add a lexer ID value:
    val SCLEX_CONF=17
  2. それから解析分類識別番号を加えてください。
    val SCE_CONF_DEFAULT=0
    val SCE_CONF_COMMENT=1
    And any lexical class IDs:
    val SCE_CONF_DEFAULT=0
    val SCE_CONF_COMMENT=1
  3. scintilla/include ディレクトリにある HFacer.py を実行し、SciLexer.h を再作成してください。Python スクリプトを実行しないで済ませる場合は これらの値を #define で SciLexer.h に定義してください。この場合は私が Scintilla.iface に追加します。
    In the scintilla/include directory run HFacer.py to regenerate the SciLexer.h file. Alternatively (if you don't want to run a Python script) just add these values to SciLexer.h as #defines and I'll put them in Scintilla.iface.
  4. scintilla/src/LexOthers.cxx の中に ColouriseConfDoc 関数を書いてください。ColouriseLatexDoc のような他の関数のひとつと似たものを書きます。
    static void ColouriseConfDoc (unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) {
    In the scintilla/src/LexOthers.cxx write a ColouriseConfDoc function similar to one of the other functions such as ColouriseLatexDoc.
    static void ColouriseConfDoc (unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) {
  5. ファイルの終わりに解析器識別番号と名前を関数に結びつけてください。
    LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf");
    At the end of the file associate the lexer ID and name with the function:
    LexerModule lmConf(SCLEX_CONF, ColouriseConfDoc, "conf");
  6. 複雑な解析器の場合は、独自のファイルに分けた方がいいでしょう。既存のファイルの一つを複製し、LexOthers が現在参照している make ファイルに新しいファイルを追加します。具体的には scintilla/win32/makefile, scintilla/win32/scintilla.mak, scintilla/gtk/makefile, scite/win32/makefile, scite/win32/scite.mak です。
    If this is a complex lexer then it may be better off in its own file, in which case clone one of the current files and then add the file to all of the make files where LexOthers is currently referenced - scintilla/win32/makefile, scintilla/win32/scintilla.mak, scintilla/gtk/makefile, scite/win32/makefile, and scite/win32/scite.mak.
  7. scite/src/others.properties に解析器と関係するファイル拡張子の項目を追加してください。
    lexer.*.conf=conf
    LexOthers に追加するのではなく新しい解析器ファイルを作っている場合は、scite/src/others.properties を複製して新しい属性ファイルを作るべきです。このファイルには次のような変更を行います。
    To the scite/src/others.properties add an entry to associate the file extension with the lexer:
    lexer.*.conf=conf
    If a new lexer file was created instead of adding to LexOthers, then a new properties file should be created by cloning scite/src/others.properties and modifying that file in the following steps.
  8. 書式を用意します。
    # 基本状態
    style.conf.0=fore:#FF0000,bold
    # 注釈
    style.conf.1=fore:#007F7F,$(font.comment)
    Set up the styles:
    # Default
    style.conf.0=fore:#FF0000,bold
    # Comment
    style.conf.1=fore:#007F7F,$(font.comment)
  9. Windows では scite/src/others.properties に conf ファイル用のフィルタを追加します。この機能は将来 GTK+ でも動作させる予定です。
    filter.conf=Configuration (.conf)|*.conf|
    If on Windows (someday this may work on GTK+ too), a filter should be added for conf files in scite/src/others.properties: filter.conf=Configuration (.conf)|*.conf|
  10. scite/src/SciTEGlobal.properties に open.filter 定義用の $(filter.conf) を追加してください。
    In scite/src/SciTEGlobal.properties add $(filter.conf) to the definition of open.filter.
  11. menu.language 属性に項目を追加して SciTE の文書の種類メニューにこの文書種を増やしてください。文書種の名前とその文書に一番よく用いられる拡張子を指定します。
    To add this language to the Language menu of SciTE, add an entry to the menu.language property including the name of the language and the file extension used most commonly for it.
  12. Scintilla と SciTE をビルドします。
    Build both Scintilla and SciTE.
  13. 共有財産にしてお楽しみください。
    Share and enjoy

解析器を作るにあたり、より広範囲な情報は Scintilla 解説書内の指示を参照ください。

For more extensive information on building lexers, see the instructions in the Scintilla documentation.