Javascript 如果评论是安全的,那么为什么';t`x=0;x+/*cmt*/+;`或'var f/*cmt*/oo=&x27;foo';`工作

Javascript 如果评论是安全的,那么为什么';t`x=0;x+/*cmt*/+;`或'var f/*cmt*/oo=&x27;foo';`工作,javascript,syntax,comments,Javascript,Syntax,Comments,线程启发了这个问题。下面是代码示例。我在寻找一个能确切说明发生了什么的答案 均x=0;x+/*cmt*/+和var f/*cmt*/oo='foo'产生语法错误,导致问题答案错误。你打断的是一个单词而不是一个句子。++和foo是单词。人们认为你不会打断这些 和空格是“安全的”一样,你不能把空格放在中间, 因为注释在级别被解析,通常被认为是空白。 编译时,第一步是把它分解成单独的“强>令牌”。< /强>注释是一种令牌,运营商是另一个。您正在拆分++运算符标记,以便将其解释为两个单独的项 来自: 注

线程启发了这个问题。下面是代码示例。我在寻找一个能确切说明发生了什么的答案


x=0;x+/*cmt*/+
var f/*cmt*/oo='foo'产生语法错误,导致问题答案错误。

你打断的是一个单词而不是一个句子。++和foo是单词。人们认为你不会打断这些


和空格是“安全的”一样,你不能把空格放在中间,

因为注释在级别被解析,通常被认为是空白。

编译时,第一步是把它分解成单独的“强>令牌”。< /强>注释是一种令牌,运营商是另一个。您正在拆分++运算符标记,以便将其解释为两个单独的项

来自:

注释的行为类似于空白并被丢弃,除非 Multilecomment包含一个行终止符字符,然后是整个 出于分析目的,注释被视为行终止符 根据句法语法


正如许多其他人所指出的,词法分析决定了事情的发展

让我指出一些例子:

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();
identifier("a");
identifier("x"); // Error: Unexpected identifier `x` at line whatever
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("ax");
operator("+");
identifier("ay");
operator("-");
const((int)0x01);
separator();
identifier("a");
identifier("x"); // Error: Unexpected identifier `x` at line whatever
operator("+");
identifier("ay");
operator("-");
const((int)0x01);
separator();
在操作符中插入注释时也会发生同样的情况

因此,您可以看到注释的行为就像空白一样


事实上,我最近刚刚读了一篇关于用JavaScript编写简单解释器的文章。这个答案对我很有帮助

那么,你能给我一个更清楚的概念,什么构成“单词”,什么构成“句子”吗?@adlwalrus评论就像空白一样。看
x=0;x+/*cmt*/+是一个错误,因为
x=0;x++是一个错误。注释是与标识符、运算符和文字常量不同的标记类型,因此它类似于空白。为什么还要将注释放在那里?只是因为注释未被读取,这并不意味着解析器将连接字符串并将其转换为有效语句,我想,但不像你的。只是智力上的自慰。没有其他原因。第一节链接到讨论评论,下面是各种标记。由于输入被分割成标记,词法分析不会产生有效的语句,这就是为什么会出现错误的原因!这整条线索太棒了,我希望我能“接受”多个答案。这就像音乐接受一样。我决定在这个答案上稍作休息,但也请查看线程的其余部分。它的信息量很大。