パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
入力データが整数かどうか判定する
(準備中)
空白を区切りとして入力されたデータから整数に合致するデータを抜きだして表示し、整数以外のデータ(文字)
があった場合はそこで処理を停止するようなプログラムを考えてみます。
こういう字句解析のプログラムはいろいろなところで応用がききますので。
正規表現の使えるプログラム言語(perl,ruby,python等)なら正規表現でマッチさせるコードをたった1行書くだけ
なんですが(−>整数を表す正規表現と有限オートマトン参照)
旧BASICでは正規表現が使えませんので地道に字句解析のプログラムを書くことになります。
プログラムとしてはほぼ有限オートマトンと実装するというような感じになります。
正規表現とか有限オートマトンの具体的な理解が深まるというメリットもあるので、BASICでやってみるのも
一興ではあります。
今回は、
空白を区切りとして入力されたデータから整数に合致するデータを抜きだして表示し、整数以外のデータ(文字)
があった場合はそこで処理を停止するようなプログラム
とします。
なお、整数として許容する形を以下の通りとします。
(整数の定義)
・0はOKだが、-0, +0 という形式は許容しない。
・先頭に0は付けることは許容しない。00, 03, 050 という表現は許容しない。
・負を表す- はOkだが、正の数には+を付けることは許容しない。
その場合の正規表現は以下の通りで、正規表現の使えるプログラム言語ならあっさり解決なんですが・・。
/^0$|^([\-]?[1-9])[0-9]*$/
この整数にマッチする有限オートマトン
○の中の数字は、状態を表しており以下のProgramの変数typeの値になります。
0・・初期状態
1・・1文字目に0が来た状態。今回は00というような表現を許さないので、先頭に0が来た場合は2文字目があったらエラーにします。
2・・1文字目が1〜9 or 2文字目以降が0〜9の状態
3・・1文字目にマイナス(-)が来た場合。次の文字は1〜9のみ許容します。-0という表現は許容しません。
以下のプログラムは、N88互換Basic for Windowsを使っています。
MS系のBasicならほぼ「どのBasicでもそのまま動作すると思います。
このプログラム(regexp_int.bas)では、
入力された文字列(a$に入力)を先頭から1文字づつ読み取って、整数にマッチするかどうか判定しながら
整数にマッチすればトークン化する(token$)という、いわゆるlexcal analyserみたいなことをやっています。
ひとつひとつの動作を可視化するために、
読み取った文字が、上記の状態0〜3のどれに当たるかを表示していきます。
(例)
0:type : 1
読み取った文字: type : 状態(0〜3 10はエラー)
読み込みが終了すると(エラーが発生した場合はエラー発生直前まで)、トークン化した結果を表示します。
さて、せっかくここまで作ったので、このプログラムを活用して、四則演算の計算機にまで
発展させてみたいと思います。
まずは、今回のプログラムを活用して、入力された文字列(式)の字句解析を行いトークン化する
ところまでをやってみます。=>「計算機を作ってみる(字句解析)」