- ヘッダーファイル 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
に,ストリームを入力列とするプログラムを示しました。