2012年05月11日

N6XBasicChecker(1)開発表明

一生懸命打ち込んだ大作ゲーム、何度もやりこんでついにエンディングかと思われた瞬間…、
Screenshot_from_2012-05-11 20:26:00.pngScreenshot_from_2012-05-11 20:29:30.png
あ…?

という経験はありませんか?
特に雑誌掲載のRPGなんかで、プレイ時間が長くセーブ機能がないゲームではエンディング間際のエラーは致命的です。

しかしBASICはインタプリタ言語であるため、プログラムの文法に間違いがあってもその行を実行するまでエラーを検出できません。
こうした悲劇を少しでも救済するため、BASIC用の静的構文チェッカーを作ろうと思います。
チェッカーはP6の実機やエミュレータ上ではなく、txt2bas用の入力ファイルをPC(Win or Linux)上でチェックするものです。
P6以外のエミュレータは疎いですが、テキストファイルのBASICリストを読み込ませられるエミュレータなら、多少の改造で対応できるようになると思います。

チェックの方法ですが、単にシンタックスエラーを調べるだけなら、イメージファイル見て中間言語に落ちているかどうか調べてもよさそうな感じがしますが、当ブログの趣旨は「レトロPCをおかずにして現代のプログラム技術を磨く」事なので、もうちょっと本格的にパーサージェネレータを使って実装したいと思います。

お前P6VXほったらかして何やっとんねんと思われるかもしれませんが、しばしお付き合いの程を。

今回使用するパーサージェネレータはANTLRです。
ANTLR用のN60-BASIC構文定義を記述して生成させたパーサーに、txt2basの入力ファイルを読み込ませてチェックさせる事になります。

2012/07/19追記
ANTLRはいろいろうまく行かない点があったので、やめました。
最終的にboost::spiritを用いて実装しました。
ANTLRで検索してきた人、ごめんなさい。

構文定義はP6のBASIC仕様を網羅していなければならないので、資料が不可欠です。
そこでヤフオクでマニュアルを落札しました。
SRのマニュアルだけあれば良かったのですがそいつは当分出ないだろうと踏んでいたので、mk2のマニュアルが出た時点で速攻で落札したら、次の週にはSRのマニュアルが出てしまいました。もちろん落札しましたよ。なんと間が悪い。
manual.jpg
とりあえず、ひと通りの構文解析ができるようになった時点で最初のバージョンを公開しようと思います。
とはいえそこまでの進捗もまだ30%くらいです。
最終的には

・PLAY文,TALK文も含めた構文チェック
・指定したの行番号範囲の文字列リテラル、DATA文をPLAY文,TALK文とみなしてパースする機能
・GOTO文などの飛び先行番号存在チェック
・代入、参照のいずれかが欠けている変数の検出(OCRの文字化け対策)
・txt2basの取り込み(しかしisioさんが音信不通とか。その時はソースを使わせて欲しいのだけど。)
・GUIの作成

といったところまでやりたいと思ってます。
入力支援ツールとしては、P6Editなんかがあるわけですが、こちらはどちらかというと、OCRで認識させたプログラムの校正支援を想定しています。

名付けてN6XBasicChecker完成するかどうかはお楽しみ(ぉぃ
posted by eighttails at 21:37| Comment(2) | N6XBasicChecker | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
Basicの構文チェッカー、出来たら公開して下さい〜

公開していませんが、実は似たようなものを作っています(mk2以降は未対応)。

gawk で作ったんですが、めちゃくちゃ複雑になって、新たに手を入れづらくなっています...

BASIC の場合、すごく複雑になる事があるので、結構大変でした。
特に変数の定義がなくて、空白を置かずに構文と混ぜて使っているので、わけわかめです...


テスト用に使ったのはこんなのです。

110 A=1:A$="11":C=EXP(1):D$=MID$(INKEY$,1,2)
120 A$="11"+"33":B$=INKEY$+LEFT$("aa",1)
130 A$="1"+"a"+"BB"+LEFT$("AA",1)+MID$(B$,1,2)+"11"
140 A=1+3+B+CSRLIN+STICK(0)
150 A=1+VAL("a")+VAL("BB")+SIN(1)+MO(1,2,3)+11
160 A=1=2:A=1<>2:A=1><2:A=1>2:A=1<2:A=1>=2:A=1=>2:A=1<=2:A=1=<2
170 A=1^2:A=1-2:A=1*2:A=1/2:A=1+2:A=1AND2:A=1OR2
180 A=NANDA:B=NORS
190 A=-1+2:B=-1.2*2+1:C=+111*2:D=NOTA+NOTB
200 COLORA$=B$:IFA$="A"+"B"THEN110
210 COLORA$=B$+"A"
220 COLOR1+2:COLORA=B:COLORA$="AA"
230 IFA$<>B$THEN110:IFA$><B$THEN110:IFA$>B$THEN110:IFA$<B$THEN110
240 IFA$>=B$THEN110:IFA$=>B$THEN110:IFA$<=B$THEN110:IFA$=<B$THEN110
300 COLOR(((A$=B$)+1)*2):PLAY("AA"+"BB"):PLAYA$+(B$+C$):COLOR(A$=B$):COLOR(A$="AA")
310 COLOR("AA"=A$):COLOR(A$="AA"):COLOR(INKEY$="AA")
320 A=(1):B=(-1):C=((1))
330 COLOR(A$=B$+C$):COLOR(A$+B$=C$):COLOR("1"+A$=B$)
340 COLOR"AA"=A$:COLORA$="AA":COLORINKEY$="AA"
350 COLORA$=B$+C$:COLORA$+B$=C$:COLOR"1"+A$=B$
500 A$="1","b":B$="AA"+
510 A=1+:B=111TO
520 COLORA$=B$+1:COLORB$+1=A$
530 COLORA$=B$*1:COLORB$*1=A$
540 A=A$="!!":B=1+"AA"=B$:C=1+B$="BB"
550 A=A$<>B$:B=B$<"A"
560 A=(1:B=1):C=(1
570 D=):E=()
580 COLOR("AA"<>A):COLOR(A$><1):COLOR(INKEY$<=1)
590 COLOR1+A$=B$


350行までは、全部正常な構文です。500行以降は、どこかにエラーがあります。

Posted by えすび at 2012年05月13日 07:32
えすび様
一定の完成度に達したらソースも含めて公開するつもりでいます。

BNFが分かる人なら、他のBASICへの対応もそれなりに容易だと思いますので。

テストケースはありがたいです。
今後のブログでも触れる予定ですが、構文定義を記述する過程のデグレードを防ぐため、今回はテストドリブンでやろうと思ってます。

gawkだと正規表現とかで探索する形になると思うので、かなりきついでしょうね。
とはいえ当時のBASICインタプリタは、パース中にアドホックな特殊処理が入ってる可能性があって、そもそもANTLRのようなLL法で構文仕様をちゃんと記述できるのかという問題はまだ残ってます。
Posted by eighttails at 2012年05月13日 19:41
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: