解析器
ScintillaをビルドするときにSCI_LEXERシンボルを定義すれば、(これは時々ScintillaのSciLexerバージョンと呼ばれる)、広範囲のプログラミング言語をサポートする解析器が含まれ、このセクションのメッセージがサポートされる。
未サポート言語のためのスタイリングや折りたたみをコンテナかさらによくこれをセットしたいなら、存在する以下のパターンのあなた自身の解析器を書く。
Scintillaは外部解析器をサポートする。
これらはDLL(Windows)または.so(GTK+/Linux)で4個の関数をエクスポートする:
GetLexerCount、GetLexerName、LexおよびFoldである。
詳細な情報はexternalLexer.cxxを見よ。
- SCI_SETLEXER(int lexer)
- SCI_GETLEXER
- SCI_SETLEXERLANGUAGE(<unused>, char *name)
- SCI_LOADLEXERLIBRARY(<unused>, char *path)
- SCI_COLOURISE(int start, int end)
- SCI_SETPROPERTY(const char *key, const char *value)
- SCI_GETPROPERTY(const char *key, char *value)
- SCI_GETPROPERTYEXPANDED(const char *key, char *value)
- SCI_GETPROPERTYINT(const char *key, int default)
- SCI_SETKEYWORDS(int keyWordSet, const char *keyWordList)
- SCI_GETSTYLEBITSNEEDED
SCI_SETLEXER(int lexer)
SCI_GETLEXER
Scintilla.hに列挙されているSCLEX_*を使うことで解析器を選択できる。
このうち二つは解析器を使わないことを示すものである。
SCLEX_NULLは解析そのものを行わない。
SCLEX_CONTAINERは装飾情報を必要とするテキストがある時に通知SCN_STYLENEEDEDをコンテナに送信する。
SCLEX_AUTOMATICは使用することができない。
これは外部の追加解析器を示し、Scintillaが未使用の解析器番号を割り当てていくものである。
SCI_SETLEXERLANGUAGE(<unused>, const char *name)
名称を元に解析器を選択する。
またこれは、外部解析器を使っている場合あるいは独自の解析器を使っていてそれに明示的な番号を割り当てたくない場合の唯一の方法である。
既存の解析器を選択する場合はnameにモジュールが与えられている名前を指定する。
大文字小文字を区別するので"ada"や"python"と指定する。
"Ada"、"Python"は使えない。
組み込み済み解析器の名前は、対応するLex*.cxxの中でLexerModuleを検索する。
LexerModuleのコンストラクタの第三引数がその名前である。
解析器の割り当てが動作するかどうかは、新しい解析器を設定する前後にSCI_GETLEXERを使って解析器番号が変化するかどうかを見る。
SCI_LOADLEXERLIBRARY(<unused>, const char *path)
共有ライブラリに実装されている解析器を読み出す。
GTK+/Linuxでは.so、Windowsでは.DLLファイルである。
SCI_COLOURISE(int startPos, int endPos)
文書のstartPosとendPosの間のテキスト装飾を現在の解析器かコンテナに実行させる。
解析器がSCLEX_CONTAINERである場合にコンテナ任せになる。
endPosが-1の場合、startPosから文書末までが対象となる。
"fold"特性が"1"に設定されていて、かつ解析器またはコンテナが折りたたみに対応している場合は折りたたみ階層数も設定される。
このメッセージは画面再描画を起こす。
SCI_SETPROPERTY(const char *key, const char *value)
キーワードと値から成る文字列の組で解析器と対話をする。
キーワードの組数に制限はなく、メモリの許す限り使える。
keyはキーワードで、大文字小文字を区別する。
valueはキーワードに関係づけられた文字列である。
すでに指定キーワードに値が設定されているときは、置換される。
長さ0の文字列を指定した場合は何もしない。
keyとvalueは修正なしで使用される。
keyで指定した文字列の先頭や末尾の空白文字も意味を持つ。
valueは他のキーワードを参照することができる。
SCI_SETPROPERTY("foldTimes10", "$(fold)0")は"$(fold)0"を格納するが、取得しようとすると$(fold)が"fold"キーワードの値に置換される。
置換されるキーワードが存在しないときはその部分の文字列はない。
現在、"fold"特性は大部分の解析器で"1"の時に折りたたみ構造を指定するように定義されている。
SCLEX_PYTHONでは"tab.timmy.whinge.level"を不正な字下げの表示方法の指定として扱う。
大部分のキーワードは整数に通訳される。
解析器のソースでGetPropertyIntの部分を探すと特性の使い方がわかる。
SCI_GETPROPERTY(const char *key, char *value)
指定されたキーを使用するkeyword:valueペアを見る; 見つけると、ユーザによって提供されたバッファに値をコピーし長さを返す(終端の0を含んでいない)。
もし見つからなければ、空文字列をバッファにコピーし0を返す。
注意: SCI_SETPROPERTYで説明される"keyword replacement"は効果がない。
もしvalue引数が0なら、値を格納するために必要な領域の長さを返す; 終端0を含んでいない。
SCI_GETPROPERTYEXPANDED(const char *key, char *value)
指定されたキーを使用するkeyword:valueペアを見る; 見つけると、ユーザによって提供されたバッファに値をコピーし長さを返す(終端の0を含んでいない)。
もし見つからなければ、空文字列をバッファにコピーし0を返す。
注意: SCI_SETPROPERTYで説明される"keyword replacement"は効果がある。
もしvalue引数が0なら、値(キーワード置換識別子を含む)を格納するために必要な領域の長さを返す; 終端0を含んでいない。
SCI_GETPROPERTYINT(const char *key, int default)
指定されたキーを使用するkeyword:valueペアを見る; 見つけると、整数として解釈しそれを返す。
もし見つからなければ(または値が空文字列なら)提供されるdefaultを返す。
もしkeyword:valueペアを見つけたが数値でない場合、0を返す。
注意: SCI_SETPROPERTYで説明される"keyword replacement"は、数値解釈の前に効果がある。
SCI_SETKEYWORDS(int keyWordSet, const char *keyWordList)
現在使用中の解析器に対して最大9 つのキーワード項目群を設定できる(バージョン1.50で6から9になった)。
keyWordSetは0~8(KEYWORDSET_MAX)で、設定する項目群番号を指定する。
keyWordListは空白文字、タブ文字、"\n"、"\r"またはこの組み合わせで区切られたキーワード群である。
キーワードはASCII標準印刷可能文字から成ることを期待した設計になっているが、コード番号1~255の区切り文字ではない文字を弾くような処理はしていない。
キーワードをどのように使うかは完全に解析器側に任されている。
一部の言語は、他の埋め込み言語を含んでいることがあり、たとえばHTMLではVBScript、JavaScriptなどがよく埋め込まれている。
HTMLの場合は項目群0がHTML、1がJavaScript、2がVBScript、3がPython、4がPHP、5がSGMLとDTDのキーワード集合を持っている。
キーワード項目群の例は解析器のコードを見よ。
完全に仕様を満たした解析器ではLexerModuleコンストラクタの第四引数が各キーワード群の用途を記述した項目群の文字列となっている。
項目群0に一般キーワード、項目群1に字下げを起こすキーワード、項目群2に字下げを解除するキーワード、という使い方もできる。
また、キーワードに色を付けるだけの簡単な解析器を使い、キーワード項目群0を差し替えることで言語の切り替えを表すということもできる。
解析器自身にキーワード項目群を組み込んでしまうことも可能だが、この場合キーワードが増えたときには解析器を再構築しなくてはならない。
SCI_GETSTYLEBITSNEEDED
現在の解析器がスタイリングに必要とするビット数を取得する。
通常、これはSCI_SETSTYLEBITSへの引数である。