这个线程启发了这个问题。这里又是代码示例。我正在寻找一个确切地说明正在发生的事情的答案。
两者都x = 0; x+/*cmt*/+;
产生var f/*cmt*/oo = 'foo';
语法错误,从而导致这个问题的答案错误。
你打断了一个词而不是一个句子。++ 和 foo 是单词。人们认为你不会打断那些。
就像你不能把空格放在单词中间一样,即使空格是“安全的”。
因为注释是在词法级别解析的,通常被认为是空格。
编译时,第一步是在词法上将其分解为单独的标记。注释是一种标记,运算符是另一种。您正在拆分 ++ 运算符标记,以便将其解释为两个单独的项目。
注释的行为类似于空格并被丢弃,除了,如果 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