BISON(とFLEX)を使いこなすようになるため、情報を収集しています。まだ学び始めたばかりなので、バージョンに拘る必要はないと思いますが、機能追加とかバグ修正の情報は押さえておきたいところです。また以前は利用できた機能が、新しいバージョンでは推奨されなくなることもあるかもしれません。そこでバージョンごとの情報をまとめた「リリースノート」のようなものを読んでみようと考えました。
GNUが提供しているソフトウェアは「NEWS」というファイルにリリースされたバージョンごとの情報が書かれており、BISONにもあります。かなり大きなファイルですので、読むには工夫が必要だと思いました。これまでも情報の整理にはTW5を利用しているので、これで何とかしてみます。
方向性としては、NEWSファイルをバージョン毎に分割して、それぞれをTW5のTiddlerに入れようと思います。ただし手作業でやっていたら、間違いも起こしますし、それ以前に、単純ではあるのですが、膨大な作業量を前にして、やる気を失ってしまうでしょう。そこでTW5にインポートできるJSON形式ファイルを生成して、一気に取り込もうと思います。
まずNEWSファイルは、次のような形式で書かれています。
* Noteworthy changes in release 3.8.2 (2021-09-25) [stable]
Fixed portability issues of bison on Cygwin.
Improvements in glr2.cc: add support for custom error messages (`%define
parse.error custom`), allow linking several parsers together.
UNIXのコマンド「csplit」を使えば、「Noteworthy changes in release」のような行を目印にファイルを分割できます。次に、分割した個々のファイルをJSON形式にします。TW5にインポート出来るJSON形式ファイルの構成は、何か適当なTiddlerをエクスポートしたファイルを覗いてみれば見当がつきます。少なくとも「title」、「tags」、「text」があれば良さそうです。また「type」は「text/plain」としておきます。
分割されたファイルをJSON形式に変換するスクリプトはAWKを使いました。あまり複雑ではありませんが、エスケープ文字の扱いなどに工夫が必要でした。最終的には、以下のようなスクリプトになりました。
#!/usr/bin/awk -f
BEGIN {
tags = "\"NEWS BISON\"";
type = "\"text/plain\"";
text = "\"";
}
{
gsub("\\\\", "\\\\");
gsub("\"", "\\\"");
gsub("\f", "");
text = text $0 "\\n";
}
NR == 1 {
sub("^.*Noteworthy changes in *", "");
sub(" *\\[.*$", "");
n = split($0, x, "[()]");
if (n == 1) x[2] = "YYYY-MM-DD";
title = "\"" x[2] " " x[1] "\"";
}
END {
text = text "\"";
printf("{\"title\":%s,", title);
printf("\"tags\":%s,", tags);
printf("\"type\":%s,", type);
printf("\"text\":%s},\n", text);
}
#[EOF]
こうして作成したJSON形式ファイルを、ひとつのファイルに結合し、微調整を加えてからTW5にインポートしました。
スクリプト作成に若干手間取りましたが、NEWSをTW5に取り込めたので、次は一つずつ読んでいくことになります。これは地道に読んでいくしかないでしょう。