前: Mystery Conflicts, 上: Algorithm


5.8 スタックオーバーフローと防ぎ方

Bison構文解析器のスタックは、あまりにも多くのトークンがシフトされて 還元されないでいると、オーバーフローする可能性があります。 スタックがオーバーフローすると、オーバーフローを報告するためにyyerror を呼び出して、関数yyparseは0でない値を返します。

マクロYYMAXDEPTHを定義して、スタックオーバーフローが起こらないように、 構文解析器のスタックの深さを調節できます。 マクロの値として、整数値を定義してください。 この値は、オーバーフローする前に、シフトされたが還元されていないトークンの 最大数になります。 マクロの値として、コンパイル時に決定可能な定数式を指定してください。

指定されたスタック領域は、割り当てられる必要はありません。 大きなYYMAXDEPTHを指定すると、 構文解析器はまず小さなスタック領域を割り当て、 必要に応じてより大きなスタック領域を割り当てます。 この割り当ての増加は、何も表示せずに、自動的に行われます。 したがって、スタックをあまり必要としない通常の入力に対して メモリを節約するために、YYMAXDEPTHを小さくする必要はありません。

特に指定しないと、YYMAXDEPTHの値は10000になります。

マクロYYINIDEPTHを指定して、最初に割り当てられるスタックの量を 調節できます。この値は、コンパイル時に決定可能な整定数の必要があります。 特に指定しないと、200になります。