KourinSnippetの更新とヒアドキュメント構文

拙作の定型文ツール「Kourin Snippet」を更新しました。

ダウンロードや更新内容はこちら Ver3.1

ヒアドキュメント構文

今回の改版で、スクリプト定型文で改行などを含めた整形済み文字列の記述と、テキストに埋め込まれた変数の展開に対応した。

例えば以下は名前と型を動的に指定してプロパティ宣言を記述するスクリプトだが、今までこのように書いていたのが

$str = "public " & $type & " " & $name & " {\r\n" _
	& "    " & "get{ return xxx" & $name & "; }\r\n" _
	& "    " & "set{ xxx" & $name & " = value; }\r\n" _
	& "}\r\n" _
	& "private " & $type & " xxx" & $name & ";"

▼こんな感じに書けるようになった。

$str = $"
public {$type} {$name} {
	get{ return xxx{$name}; }
	set{ return xxx{$name} = value; }
}
private {$type} xxx{$name};
"$ : Deploy

「$"」で終わる行の次の行から、「"$」で始まる行の前の行までが整形済みテキストリテラルになる。

Deployは文字列中の変数を展開する標準関数である。

複数行にわたる文章を作るために文字列を一行ずつ結合するというのは、定型文ツールとして使い勝手が悪いとは思っていた。しかしそれをスクリプトの構文自体に組み込むか、アプリで個別に対応するか迷っていたため中々踏み切れなかった。

結果としてKourinスクリプト自体も改版するに至った。

面倒だった点

このKourinスクリプトは元々エクセル関数のような使い方を想定して書いたものだ。なので1行で1処理が基本になっている。{~}で複数行をブロックとして記述するのは後付けで無理やり入れたものになる。

「{」や「}」はトークンとして存在せず、その部分は"未解析のスクリプト文"のまま保持されていて、それが実行されるときに改めて一行ずつに分割されて字句解析から処理される。

つまり実際に解析処理に至ったときには「改行」は含まれれないのを前提としていた。

ご存じの通り改行コードは[CR][LF]/[CR]/[LF]の三種類が使われる。今まで通りの処理に改行の判断を加えるのはだいぶ煩雑に思えた。

いろいろ考えたが、結局は解析前にスクリプト部分の改行は全て[LF]に統一することにした。そして解析処理としては今まで通り行の考え方はせずに、『「$"\n」から「\n"$」まで』を判断して整形済み文字列リテラルとするような実装になった。

変数展開

もう一つのポイントである文字列に含まれる変数の展開。これもローカル変数にアクセスするため、スクリプト標準の特別関数として実装した。

具体的には {\s*(\$\$?[^\s\$\{\}]+)\s*} の正規表現で抽出される部分を変数の値に置き換えている。

多くのプログラムでは、この部分にスクリプトを書ける(例えば {$n + 1} のような)ことが多いが、それには対応していない。

まあそれに対応すると結果的に文章内の「{」「}」をエスケープする必要が出てきて、それはそれでプログラムの生成を定型文に登録してる身としては不便なため、まあいいかと思った次第。

コメント