3

このスレッドは質問に影響を与えました。もう一度コードサンプルを示します。何が起こっているのかを正確に伝える答えを探しています。

との両方x = 0; x+/*cmt*/+;var f/*cmt*/oo = 'foo'; 構文エラーが発生するため、この質問の回答が間違っています。

4

5 に答える 5

8

文ではなく単語を中断しています。++ と foo は単語です。人々は、あなたがそれらを邪魔することはないと思い込んでいます。

空白が「安全」であるにもかかわらず、単語の途中に空白を入れることができないのとほぼ同じです。

于 2012-09-30T06:50:37.230 に答える
5

コメントは字句レベルで解析されるため、一般に空白と見なされます。

于 2012-09-30T06:51:47.920 に答える
3

コンパイル時の最初のステップは、個々のトークンに字句的に分割することです。コメントはトークンの 1 つのタイプであり、演算子は別のタイプです。2 つの個別の項目として解釈されるように、++ 演算子トークンを分割しています。

于 2012-09-30T06:52:14.183 に答える
2

ECMAScriptリファレンスから:

コメントは空白のように動作し、破棄されます。ただし、MultiLineCommentにラインターミネータ文字が含まれている場合、構文文法による解析の目的で、コメント全体がLineTerminatorと見なされます。

于 2012-09-30T07:07:35.250 に答える
1

他の多くの人が指摘しているように、字句解析は物事がどのようになるかを決定します。

いくつかの例を指摘させてください。

ax + ay - 0x01; /* hello */
^----^---------------------- Identifier (variables)
   ^----^------------------- Operator
          ^----------------- literal constant (int)
              ^------------- Statement separator
  ^-^--^-^---  ^------------ Whitespace (ignored)
                [_________]- Comments (ignored)

したがって、結果のトークンリストは次のようになります。

identifier("ax");
operator("+");
identifier("ay");
operator("-");
const((int)0x01);
separator();

しかし、これを行う場合:

a/* hello */x + ay - 0x01;
^-----------^---^----------- Identifier (variables)
              ^----^-------- Operator
                     ^------ literal constant (int)
                         ^-- Statement separator
             ^-^--^-^------- Whitespace (ignored)
 [_________]---------------- Comments (ignored)

結果のトークンリストは次のようになります。

identifier("a");
identifier("x"); // Error: Unexpected identifier `x` at line whatever
operator("+");
identifier("ay");
operator("-");
const((int)0x01);
separator();

次に、コメントが演算子内に挿入されたときにも同じことが起こります。

したがって、コメントが空白のように動作することがわかります。

実際、私は最近、JavaScriptを使用した単純なインタープリターの作成に関する記事を読んだばかりです。それは私がこの答えを手伝ってくれました。http://www.codeproject.com/Articles/345888/How-to-write-a-simple-interpreter-in-JavaScript

于 2012-09-30T07:11:21.057 に答える