- ヘッダーファイル str2int.h が必要です。
#include "str2int.h"のように使ってください。 - C言語で
*(str++)というのはstr[i++]のようなものです。 (c = str[i++]) != EOFはstr[i]を c に代入しi++を実行しcの値がEOFに等しくないか比較します。
- したがって
while ((c = str[i++]) != EOF) { ... }は,「strから1文字ずつ取得しループする。EOF になったら終了。」という意味です。 - オートマトンのプログラムを作る流儀はいくつかありますが,状態遷移とは,つきつめると gotoであり,gotoで移動しながら処理を進めるプログラムを示します。
- 状態1つ1つに対応する gotoラベルを記載します。
- gotoで状態遷移します。
- 入力を受理したときの処理は次のいずれかの方法が考えられます。
- 終了状態へ遷移する
- returnで関数を脱出する
- ここでは return文で脱出します。
- 状態ごとの処理の先頭で1文字入力をします。
goto文を持たないプログラミング言語では,次の指針で,
同じようなプログラムをざっくり作れます。
String2int.java を参照してください。
- 状態を表す型を定義します。(
enum型が便利) - 入力列から1文字ずつ取得するループを作ります。
- ループ内の switch 文で,状態の処理を担当する caseラベルにジャンプします。
- 入力済みの文字に応じた処理をします。
- 正常終了するときは returnで関数を脱出します。
- 状態遷移は次を行います。
- 状態変数に遷移先の状態を代入
continue
continueにより次のように処理が進みますswitch文からの脱出(状態ごとの処理を終了)- ループの先頭に戻る
- ループ処理の条件判定を実行; この際,同時に文字入力を進める
switch文で,次の状態のラベルへジャンプする
- まとめると
- プログラムの字面では,次の状態の代入と
continueを行う - 実質的に,文字入力と次の状態へのジャンプが行われる
- プログラムの字面では,次の状態の代入と
このプログラムでは「入力列」として Cの文字列を用いていますが,
ファイルやそれを抽象化したストリームを「入力列」とするのが実用的です。
Java 版の String2int.java に,ストリームを入力列とするプログラムを示しました。