2012年09月02日

N6XBasicChecker(3)boost::spirit事始め

なんか夏休み中にいろんなイベントが重なったので、色々脱線してしまいましたが、N6XBasicCheckerの内部の解説を再開したいと思います。

spiritはboostと呼ばれるC++ライブラリ群の1つで、パーサージェネレータとして機能します。
特徴としては
・テンプレートクラスとして実装され、ヘッダーをインクルードするだけで利用できる。
 spirit自体をビルドしてアプリからリンクする必要がないので、特にWindowsではちょっとだけ楽です。
・結構速い
 ベーマガ掲載のBASICリスト100本を2〜3秒でパースします。

ところで、こことかこことかこことかこことかこことかを見ていただけると解ると思いますが、日本語でboost::spiritを形容するのに最も使われている単語は「変態」です。
続きを読む
posted by eighttails at 11:21| Comment(0) | N6XBasicChecker | このブログの読者になる | 更新情報をチェックする

2012年08月14日

N6XBasicChecker(2)構文解析器事始め

N6XBasicCheckerも、まだまだやり残していることが多いとはいえ、とりあえず機能するようになったので、ここらで一度、内部の技術的な解説をしておきたいと思います。
N6XBasicCheckerは、構文解析器と呼ばれるジャンルのソフトウェアです。
テキストファイルを先頭から読み込み、BASIC言語の構文規則に合致しているかチェックします。
この構文解析器のプログラムは手作業で記述することも原理上可能ですし、実際にN6XBasicCheckerと同等の構文解析器を手作業で記述したプログラムも存在します。
P6つくろうブログ 簡易BASICチェックツール
が、構文解析中の条件分岐の組み合わせが膨大な数になるため、通常はパーサージェネレーターというツールを使用します。
続きを読む
posted by eighttails at 01:18| Comment(0) | N6XBasicChecker | このブログの読者になる | 更新情報をチェックする

2012年08月12日

N6XBasicChecker 1.1リリース

N6XBasicCheckerのバージョン1.1を公開します。

Windows版のバイナリはこちら。
N6XBasicChecker-1.1-win.zip
ソースコードはこちらになります。
N6XBasicChecker-1.1-src.zip

今回の主な新機能は「警告機能」です。
どこからも代入されていない変数、どこからも参照されていない変数を検出します。
変数名の打ち間違いやOCRによる文字化けはエラーにならないので実行時デバッグが大変ですが、
このチェックにより動作チェックがだいぶ楽になるだろうと思って作りました。

ただ、実際に作ってみると、既存のプログラムでも警告が大量に出るわ出るわ。
みなさんやっぱり、一度プログラムが動いたら、特に整理とかしないでリリースしちゃうもんなんですね…。
まあ当時の開発環境では、そういうクリーンナップやリファクタリングが困難だったという事情もあると思います。

BASICチェッカーを作るという行為は、「BASICとはいかに適当な言語であるか」を
知るプロセスであるという事を悟りだしています。

【更新履歴】
ver. 1.1 2012/08/11
機能追加
・警告の追加
  エラーの他に「警告」というメッセージ種類を追加しました。
・変数の代入、参照チェック
  例えば、S=STICK(0)という文を打ち間違えて、
  S=STOCK(0)と打ち込んでしまった場合、これは数値型の配列変数として解釈され、エラーになりません。
  今回のバージョンで、代入だけされて参照されていない変数、またはその逆を検出できるようにしました。
  例外として、FOR文のループカウンタとしてしか使われていない変数は、どこからも参照されていなくても
  警告を出しません。
  USR()とRND()関数については、戻り値を受けるためのダミーの変数を用意するケースが多いですが、
  現時点では、これらは全て警告が出ます。ご了承ください。
  また、3文字以上の変数名で、2文字目までが一致しているものが複数ある場合、警告を出すようにしました。
・行番号の整合性チェックを追加(?UL Error相当エラーの検出)
・GOTO,GOSUBの後に余分な記述があった場合に警告を出すようにした。
 (実行時エラーにならないので、この挙動を利用してコメントなどを入れる人がいるが、
GOTOの後のコロンが抜けた場合、次のステートメントが実行されない事態になるため)

バグ修正
・半角カナ記号の一部に対応していなかったのを修正。
・内部トレースが出力されることがあったのを修正。
・正常なIF文でエラーが出ることがあったのを修正。


posted by eighttails at 00:25| Comment(0) | N6XBasicChecker | このブログの読者になる | 更新情報をチェックする