3

私はJavascriptでの括弧の働きについて疑問に思っていたので、テストするためにこのコードを書きました:

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
4+4
))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

で構成されています:

( x1174
4+4
) x1174

上記のコードをGoogleChrome20(Win64)でテストしたところ、正しい答えが得られました(8)。

しかし、同じコードを試してみると、(両側に)1175の括弧が付いていると、stackoverflowエラーが発生します。

このコードはJSFiddleで確認できます(注:JSFiddleでは、1178個の括弧で機能しなくなります)

だから、私の質問は次のとおりです。

  • なぜそれが起こるのですか?
  • JSFiddleでは1178の括弧で動作を停止するのに、空白のページでは1175しか動作しないのはなぜですか?
  • このエラーはページ/ブラウザ/OSに依存しますか?
4

2 に答える 2

6

多くの場合、言語はrecursive descentと呼ばれるパターンに沿って設計されたコードによって解析されます。ここでそれが当てはまるかどうかはわかりませんが、確かに「スタック オーバーフロー」エラーは大きな証拠です。

式を解析するには、式が何であるかを調べることによって構文にアプローチするという考え方です。括弧で囲まれた式は、「式内の式」のようなものです。したがって、パーサーが初めて目にするコード内の式を体系的に解析する場合 (パーサーにとって、これは永遠の運命です)、左括弧は「わかりました - (スタック上で) 実行していることを保持してください」を意味します。 )、式の可能性のあるものの先頭から始めて、新鮮で完全な式を解析し、一致する閉じ括弧が表示されたら戻ってきます。」.

したがって、1000 個以上の括弧の文字列は、同じアクティビティの同等のカスケードをトリガーします。取得したものを棚に置きます。飛び込んで部分式を取得し、それがどのように見えるかがわかったら再開します。

これが何かを解析する唯一の方法ではないことに注意してください。多くの方法があります。私は個人的に再帰降下解析の大ファンですが、特に特別なことはありません (ただし、いつか本物のユニコーンを見ることになると思います)。

于 2012-07-25T00:50:33.230 に答える
5

Javascriptの実装が異なるため、ブラウザによって動作が異なります。言語は、このようなものがどのように失敗するかを指定していないため、各実装は異なる方法で失敗します。

JSFiddleと空白ページの違いは、JSFiddle自体がいくつかのスタックフレームを使用して、コードを実行する環境を確立するためです。

于 2012-07-25T00:38:03.453 に答える