次: , 上: Rpcalc Rules


2.1.2.1 inputの説明

inputの定義について考えます。

     input:    /* 空 */
             | input line
     ;

この定義の意味は、「完全な入力とは、空文字列であるか、あるいは、 完全な入力に入力行が続いたものである」ということです。 「完全な入力」が、それ自身を使って定義されていることに注意してください。 列の中でinputが常に左端の記号なので、 このような定義を左再帰(left recursive)と呼びます。 See Recursive Rules

最初の選択肢は、`:'と`|'の間に記号がないので空です。 これは、(トークンを含まない)空の入力文字列にマッチします。 電卓を起動した直後にCtrl-d 1を 押しても、正しい入力と扱われるように、この規則を入れました。 通常、空に対応する選択肢を最初に置き、そこに`/* 空 */'と 書きます。

2つめの選択肢である規則(input line)は、 自明(空)でないすべての入力を扱います。 その意味は、「任意の数の行を読み込んだ後で、もし可能ならば、 もう1行読み込む」ということです。 左再帰が、この規則を繰り返しにします。 最初の選択肢が空の入力にマッチするので、 0回以上任意の回数の繰り返しになります。

構文解析器関数yyparseは、文法エラーが発生するか、あるいは、 字句解析器がもうトークンがないと判定するまで、 入力の処理を続けます。 ファイルの終わりで起きることについては、後で考慮します。


脚注

[1] 【訳注】UNIXの標準的なコンソールの 設定で、入力の終わりを示す制御文字で、MS-DOSでは代わりにCtrl-z