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

编译时,第一步是在词法上将其分解为单独的标记。注释是一种标记,运算符是另一种。您正在拆分 ++ 运算符标记,以便将其解释为两个单独的项目。

于 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 回答