nounai.output(spaghetiThinking);

趣味と実益を兼ねて将棋プログラム(研究ツールなど)を作ってみたいと思う私の試行錯誤とか勉強したことを綴ってゆく予定です。 主目的はプログラミングの経験値稼ぎですが、コンピュータ将棋の製作も目指してみたいとも考えています。

CSAフォーマットの不備・不明瞭点についての考察

ここ最近はCSAファイルから構文木、抽象構文木を構成するプログラムを書いています。その過程で気づいた仕様のあいまいさとかについてのメモ。勘違いもあるかも。なおCSAの仕様はVer.2.2を参照しています。


あくまで現状の私レベルでの見解です。的外れもある気がすますが一応メモ的な感じで残しておきます。

セパレータ (スラッシュ)について
仮にセパレータが1個入っている棋譜ファイルがあるとする。セパレータの前後にある棋譜をそれぞれA,Bとする。この場合、Bの側に対局者・期戦情報とか、あるいは初期配置(必須)がなかった場合にAのそれを補完する、ということが許されるのかどうか。多分AとBは完全に独立、という扱いが正解なのでしょうが、同一のカードを同一のファイル内にまとめて記述したい、とかの場合には、補完自体はNGとしても、補完指示にあたるオペレータがあってもいいのではない かとも思います。また、私的にはセパレータは案外利用価値があるオペレータだと思っています。例えば、棋譜解析・学習においてあらかじめ対象ファイル数を削減するといった目的や、7番勝負を通して鑑賞したいだとか、ある棋士順位戦の対局を1期分まとめて鑑賞したいとかが考えられます。要は注目したいもの(特定の対局者、期戦など)がある場合です。主に鑑賞の時に便利かなと。
マルチステートメント(コンマ)について
コメント行の中のコンマや、ドルマークで始まるインフォメーションに関する行の中で現れたコンマをどう解釈するのか?という問題です。コメント中のコンマは読み飛ばしでOKだと思いますが、インフォメーションの行では文章の一部としてコンマを使いたい場面もあるかもしれません。インフォメーション行中のコンマを解釈すべきか否か、これは議論があっていいように思います。なお私が今書いてるコードではコメント行以外の場所で現れたコンマは全てマルチステートメントとして解釈させています。
行頭、行末(あるいはマルチステートメント記号の前後)の空白を許すかどうか
まあ解釈する側で適宜切り詰めろよって話だと思いますが、一応。
CSA仕様は上方互換か下方互換か( 、どちらでもないか)
これは明示してあるのとないのでは結構負担が変わってくる気がします。バージョンの差異を吸収できるコードを書く時にはこの辺の情報が欲しい。まぁ、ちゃんと仕様を確認すれば事実上○○互換だ、ってのはあるかも知れませんが、仕様策定者の意図が必ずしもそれに一致しているとは限りませんので、安心して実装の前提条件に据えられません。仕様の厳密さとは離れた、意志みたいな部分ですが、そういった仕様策定の方向性とかのドキュメントがあればいいなと思ったりします。
行の先頭文字だけではカテゴリが確定できない
具体的には開始手番と着手の2つです。両方+かーで始まるので1文字目を見ただけではその行のカテゴリが確定できない場合があります。別にさほど問題がある訳ではないですが、オペレータの種類自体少ないんだからそのくらい分けておいてくれよ、と思いました。何ぶん面倒くさがりなので。
初期配置の指定の優先順位など
盤面一括指定と行指定・個別指定は混在していてもいいのか?いいのであればそれをどういう優先順位で解釈すべきか?といった話。指定が被ったら新しい方で上書き、という方法にするとか、一括指定があれば行単位指定や個別指定は全て無視するようにする、とか、「間違いじゃない答え」は複数ある。

以上。構文解析はハードル高く見えてたけど案外なんとかなりそうです。ただコード書いてるうちにこうした引っかかりが出てきたり、設計の壁に当たって一からコード書き直したりとかでなんだかんだ時間を食っています。