構文カラー強調表示は、プログラミング言語やマークアップ言語などの各種の 構文要素(キーワード、コメント、文字列リテラル、タグなど)を色分け表示して、 見易くする機能です。
本エディタでは、汎用性を重視して、構文要素のパターン 指定に、正規表現 が使えるようになっています。また、 高速性を重視して、その正規表現の検索は、特別に、DFAエンジンで行ないます。 この検索エンジンは、各パターンを並列的に検索します。その際、 いわゆるバックトラックは発生しません。 例えば、多数のキーワードを検索する場合でも、それらを逐一比較するのではなく、 全部を同時進行的に検索します。そのため、通常のNFAエンジンや、 単純な比較検索手法よりも、はるかに高速です。ただ、DFAエンジンでは、 NFAエンジンよりも、検索テーブルのメモリーサイズがかなり大きくなり、 検索可能な正規表現のパターンが限定されるという弱点もあります。 しかし、通常の用途では、メモリーサイズが問題になることは稀です。また、 次に述べるコンテキストの設定によって、扱える構文パターンの範囲は、 格段に広がります。
構文パターンは、コンテキスト(文脈)に依存する場合があります。例えば、 HTMLテキストでは、通常のテキスト部とタグ内のテキスト部では、構文パターンは まったく異なります。また、<SCRIPT> と </SCRIPT> タグとの間には、 スクリプト言語のプログラムが記述されますが、この範囲内だけで、その言語の 構文要素をカラー強調表示する場合もあります。あるいは、C言語等で、コメント内 でのみ、特定の語句を強調表示したい場合もあります。
このような場合のために、本エディタでは、構文パターンのコンテキストを設定
できるようになっています。このコンテキストは、その開始と終了のパターンで
識別されます。つまり、コンテキストは、その開始パターンに一致する部分から始まり、
その終了パターンに一致する部分で終ります。
1つの環境内には、このコンテキストは、最大3個まで設定できます。但し、
コンテキストの中に、コンテキストは設定できません。つまり、コンテキストは
入れ子にはできません。
構文要素のパターンは、コンテキスト外で、7個まで指定できます。また、
各コンテキスト内で、開始と終了のパターンを含めて、8個まで指定できます。
各パターンは、次の「一致条件」で
指定できます。
・正規表現
・最小一致
・英字大小同一視
・単語の先頭
・単語の末尾
・行頭
・行末
また、各パターンには、次の「表示属性」が
指定できます。
・文字色
・背景色
・太字
・下線
構文カラー強調表示は、各環境ごとに、環境設定の 「テキスト表示」→「構文カラー強調表示」で、 設定できます。また、ここで使う正規表現の仕様は、「正規表現の詳細仕様(DFAエンジン)」で説明しています。
次に、構文パターンの設定例を示します。この例は、初期環境での、C++ と HTML 用の 設定です。下記では、煩雑にならないように、各一致パターンだけを示しています。 「一致条件」や「表示属性」の詳細は、実際の環境設定の内容で確認できます。
予約語 |
asm|auto|bool|break|case|catch|char|class|const|const_cast| continue|default|delete|do|double|dynamic_cast|else|enum| explicit|extern|false|float|for|friend|goto|if|inline|int| long|mutable|namespace|new|operator|private|protected|public| register|reinterpret_cast|return|short|signed|sizeof|static| static_cast|struct|switch|template|this|throw|true|try| typedef|typeid|typename|union|unsigned|using|virtual|void| volatile|wchar_t|while |
文字列 | "([^"\\]|\\(.|\n))*("|\n) |
文字定数 | '([^'\\]|\\.)*('|\n) |
定数値 | (\d+|0x[0-9A-F]*)U?L?|\d+(\.\d*)?(E[\-+]?\d*)?[FL]? |
マクロ |
#[ \t]*(define|elif|else|endif|error|if|ifdef|ifndef|include| line|pragma|undef) |
ラベル | [A-Z_]\w*:([^:]|\n) |
【開始】 | /* |
【終了】 | */ |
【不特定部】 |
【開始】 | // |
【終了】 | \n |
【不特定部】 |
DOCTYPE | <!\a+[^>]*> |
文字参照 | &[#\a\d]+; |
IPアドレス | \d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d? |
URL | (http|ftp)://[\a\d$\-_.+!*'(),:@~&$=;?%/]+ |
(mailto:)?[\w\-]+@[\w.\-]+ |
【開始】 | </?\w+ |
【終了】 | > |
【不特定部】 | |
属性名 | [\w\-]+\s*= |
属性値(1) | [^=\s>"';]+ |
属性値(2) | \s*"[^"]*" |
属性値(3) | \s*'[^']*' |
【開始】 | <!-- |
【終了】 | --\s*> |
【不特定部】 |
【開始】 | <SCRIPT\s[^>]*> |
【終了】 | (//.*)?</SCRIPT> |
【不特定部】 | |
コメント | ((/\*(.|\n)*\*/)|(//.*\n)) |
文字列 | "([^"\\]|\\(.|\n))*("|\n) |
文字定数 | '([^'\\]|\\.)*('|\n) |
予約語 |
abstract|boolean|break|byte|case|catch|char|class|const|continue| default|do|double|else|extends|false|final|finally|float|for| function|goto|if|implements|import|in|instanceof|int|interface| long|native|new|null|package|private|protected|public|return| short|static|super|switch|synchronized|this|throw|throws| transient|true|try|var|void|while|with |