racc 1.2.6のcparseで無限ループ発生せず

<a href=”http://www.northern-cross.info/wordpress/index.php/archives/26″>racc 1.3のcparseで無限ループ発生</a>で、cparseでもエラー回復モードからエラー回復できず、無限ループに陥ったことを報告しました。

1.3.0以外の(別のことが原因で実行できなかった1.3.1, 1.3.を除いて)1.3.*では無限ループになりませんでした.

また、1.3.0の一つ前のバージョンの、1.2.6では無限ループが発生しませんでした.

1.3.0と1.2.6は構造体のメンバに直接アクセスするか、構造体へのポインタを介してアクセスすか程度の違いしかなく、無限ループになるかならないかは、参照するテーブルの違いの可能性が大きいです。

より具体的に言えば、テーブルを作成するメソッドの違いではないかということです。

複数のテーブル間の参照がからんでくるので、テーブルの内容の一がずれていたり指している先がどこか一ヶ所でもずれてたら、その後の参照内容が間違ってしまいます。

実際、1.3.0では、文法エラーとなるトークンを読み込んだとき、文法エラーであるとは判定しています。

しかし、それに対するアクションが定義済みと判断し、エラーとなるトークンをそのままシフト、還元して、最終的に無限ループになってしまいます。

もしアクションを示すテーブルの一つ前の要素をさしていたら、アクションは未定義と判定され、状態を一つ前に戻し、$endを読みこむことになり、エラー回復につながるのですが。

次は、テーブル作成の部分を調べてみます。

racc 1.2.6のcparseで無限ループ発生せず” への1件のコメント

  1. ピンバック: raccのparser.rbへのとりあえずのパッチ作成 « northern-cross blog

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です