次: Rpcalc Line, 上: Rpcalc Rules
input
の説明input
の定義について考えます。
input: /* 空 */ | input line ;
この定義の意味は、「完全な入力とは、空文字列であるか、あるいは、
完全な入力に入力行が続いたものである」ということです。
「完全な入力」が、それ自身を使って定義されていることに注意してください。
列の中でinput
が常に左端の記号なので、
このような定義を左再帰(left recursive)と呼びます。
See Recursive Rules。
最初の選択肢は、`:'と`|'の間に記号がないので空です。 これは、(トークンを含まない)空の入力文字列にマッチします。 電卓を起動した直後にCtrl-d 1を 押しても、正しい入力と扱われるように、この規則を入れました。 通常、空に対応する選択肢を最初に置き、そこに`/* 空 */'と 書きます。
2つめの選択肢である規則(input line
)は、
自明(空)でないすべての入力を扱います。
その意味は、「任意の数の行を読み込んだ後で、もし可能ならば、
もう1行読み込む」ということです。
左再帰が、この規則を繰り返しにします。
最初の選択肢が空の入力にマッチするので、
0回以上任意の回数の繰り返しになります。
構文解析器関数yyparse
は、文法エラーが発生するか、あるいは、
字句解析器がもうトークンがないと判定するまで、
入力の処理を続けます。
ファイルの終わりで起きることについては、後で考慮します。