構文カラー強調表示

■ 機能説明

 構文カラー強調表示は、プログラミング言語やマークアップ言語などの各種の 構文要素(キーワード、コメント、文字列リテラル、タグなど)を色分け表示して、 見易くする機能です。

 本エディタでは、汎用性を重視して、構文要素のパターン 指定に、正規表現 が使えるようになっています。また、 高速性を重視して、その正規表現の検索は、特別に、DFAエンジンで行ないます。 この検索エンジンは、各パターンを並列的に検索します。その際、 いわゆるバックトラックは発生しません。 例えば、多数のキーワードを検索する場合でも、それらを逐一比較するのではなく、 全部を同時進行的に検索します。そのため、通常のNFAエンジンや、 単純な比較検索手法よりも、はるかに高速です。ただ、DFAエンジンでは、 NFAエンジンよりも、検索テーブルのメモリーサイズがかなり大きくなり、 検索可能な正規表現のパターンが限定されるという弱点もあります。 しかし、通常の用途では、メモリーサイズが問題になることは稀です。また、 次に述べるコンテキストの設定によって、扱える構文パターンの範囲は、 格段に広がります。

 構文パターンは、コンテキスト(文脈)に依存する場合があります。例えば、 HTMLテキストでは、通常のテキスト部とタグ内のテキスト部では、構文パターンは まったく異なります。また、<SCRIPT> と </SCRIPT> タグとの間には、 スクリプト言語のプログラムが記述されますが、この範囲内だけで、その言語の 構文要素をカラー強調表示する場合もあります。あるいは、C言語等で、コメント内 でのみ、特定の語句を強調表示したい場合もあります。

 このような場合のために、本エディタでは、構文パターンのコンテキストを設定 できるようになっています。このコンテキストは、その開始と終了のパターンで 識別されます。つまり、コンテキストは、その開始パターンに一致する部分から始まり、 その終了パターンに一致する部分で終ります。
 1つの環境内には、このコンテキストは、最大3個まで設定できます。但し、 コンテキストの中に、コンテキストは設定できません。つまり、コンテキストは 入れ子にはできません。

 構文要素のパターンは、コンテキスト外で、7個まで指定できます。また、 各コンテキスト内で、開始と終了のパターンを含めて、8個まで指定できます。
 各パターンは、次の「一致条件」で 指定できます。
  ・正規表現
  ・最小一致
  ・英字大小同一視
  ・単語の先頭
  ・単語の末尾
  ・行頭
  ・行末
また、各パターンには、次の「表示属性」が 指定できます。
  ・文字色
  ・背景色
  ・太字
  ・下線

 構文カラー強調表示は、各環境ごとに、環境設定の 「テキスト表示」→「構文カラー強調表示」で、 設定できます。また、ここで使う正規表現の仕様は、「正規表現の詳細仕様(DFAエンジン)」で説明しています。

■ 設定例

 次に、構文パターンの設定例を示します。この例は、初期環境での、C++ と HTML 用の 設定です。下記では、煩雑にならないように、各一致パターンだけを示しています。 「一致条件」や「表示属性」の詳細は、実際の環境設定の内容で確認できます。

例1 C++ 言語
コンテキスト外:
 予約語 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)
 ≪補説≫
コンテキスト(1): コメント(1)
 【開始】 /*
 【終了】 */
 【不特定部】
 ≪補説≫
コンテキスト(2): コメント(2)
 【開始】 //
 【終了】 \n
 【不特定部】
コンテキスト(3): 未設定


例2 HTML
コンテキスト外:
 DOCTYPE  <!\a+[^>]*>
 文字参照  &[#\a\d]+;
 IPアドレス  \d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?
 URL  (http|ftp)://[\a\d$\-_.+!*'(),:@~&$=;?%/]+
 E-Mail  (mailto:)?[\w\-]+@[\w.\-]+
コンテキスト(1): タグ
 【開始】 </?\w+
 【終了】 >
 【不特定部】
 属性名 [\w\-]+\s*=
 属性値(1) [^=\s>"';]+
 属性値(2) \s*"[^"]*"
 属性値(3) \s*'[^']*'
コンテキスト(2): コメント
 【開始】 <!--
 【終了】 --\s*>
 【不特定部】
 ≪補説≫
コンテキスト(3): スクリプト
 【開始】 <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
 ≪補説≫

【 注意事項 】