このスレッドは質問に影響を与えました。もう一度コードサンプルを示します。何が起こっているのかを正確に伝える答えを探しています。
との両方x = 0; x+/*cmt*/+;
でvar f/*cmt*/oo = 'foo';
構文エラーが発生するため、この質問の回答が間違っています。
文ではなく単語を中断しています。++ と foo は単語です。人々は、あなたがそれらを邪魔することはないと思い込んでいます。
空白が「安全」であるにもかかわらず、単語の途中に空白を入れることができないのとほぼ同じです。
コメントは字句レベルで解析されるため、一般に空白と見なされます。
コンパイル時の最初のステップは、個々のトークンに字句的に分割することです。コメントはトークンの 1 つのタイプであり、演算子は別のタイプです。2 つの個別の項目として解釈されるように、++ 演算子トークンを分割しています。
コメントは空白のように動作し、破棄されます。ただし、MultiLineCommentにラインターミネータ文字が含まれている場合、構文文法による解析の目的で、コメント全体がLineTerminatorと見なされます。
他の多くの人が指摘しているように、字句解析は物事がどのようになるかを決定します。
いくつかの例を指摘させてください。
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