|
2. 種類を「複数行」にした際に、特定のパターンで囲われた区間だけ本来の強調表
示を中断させる方法です。
C# や PowerShell など最近の言語で、文字列リテラル中に任意の式を埋め込ん
で自動的に展開する
「補完文字列」というものが実装されるようになりました。例えば C# では
str = $@"aaaaaaaaa{ ( val == null ? @"null" : val.ToString() ) , 3 }bb
bbbbb
ccccccccc{ 0
+ 1
+ 2
+ 3
+ 4
, 2 : X2
}dddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeee" ;
で、PowerShell では
$str = "aaaaaaaaa$(
if ( $null -eq $val ) {
"null"
} else {
$val.ToString()
)bbbbbbbbbbbbb`nccccccccc$( ( 0 + 1 + 2 + 3 + 4 ).ToString()
)dddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
eeeee"
という感じのものです。この場合、C# では「{」と「}」で、PowerShell では
「$(」と「)」で囲まれた
部分が「補完式」となって任意の式や文を記述することが可能です。補完式の範
囲外の「aaaaa ... 」とか
「bbbbb ... 」といった部分は通常の「静的な文字列リテラル」と同じ扱いとな
ります。
ここで問題となるのが、この「静的リテラル」だけを狙って「表示方法」を「文
字定数」にして「複数行」の
強調表示を行うための方法です。上記の C# の例の場合、「開始文字列」を「$@
"」に、「終了文字列」を
「"」にして「表示方法」を「文字定数」とする「複数行」で定義すると、「{」
と「}」で囲われた「補完式」の
部分まで全て「文字定数」で色付けされてしまいます。このため、この「補完
式」の部分だけを除外して
それ以外の「静的リテラル」だけを「文字定数」で色付けして、「補完式」の範
囲内では
・ローカル変数 val は「普通の文字」のまま。
・演算子 == 、 ? 、 : などは「強調表示 1」。
・数字 0 、1 、... は「数値」。
・入れ子になった文字列 @"null" は改めて「文字定数」。
という本来の色付けを行う、といったことがどうしても上手くできません。
「静的リテラル」だけを狙うつもりで { 開始文字列 , 終了文字列 } の組を
a. { \$@" , \{ }
b. { \} , \{ }
c. { \} , " }
の 3 つ用意して「文字定数」とするような方法では、b. の項目が例えば
if ( condition )
{
System.Console.WriteLine( @"a" ) ;
}
else
{
System.Console.WriteLine( @"b" ) ;
}
というコードの 3 〜 5 行目の「} else {」の部分まで「文字定数」とするよう
な誤爆が起きてしまいます。
今までの経験から、このような誤爆の回避は大変困難であることが分かっていま
す。
|
|