如果评论是安全的,那么为什么不'X = 0; X + / * CMT * / +;`或`

2019-08-01 01:55发布

这个线程启发的问题。 下面是代码样本一次。 我在寻找告诉到底是怎么回事,就答案。

两个x = 0; x+/*cmt*/+; x = 0; x+/*cmt*/+;var f/*cmt*/oo = 'foo'; 产生语法错误,这使得在回答这个问题的错误。

Answer 1:

从ECMAScript的参考 :

评论表现得像空白和被丢弃,只是,如果MultiLineComment包含行终止符,则整个注释被认为是由句法语法分析的目的的LineTerminator。



Answer 2:

你打断一个字,而不是一个句子。 ++和Foo是的话。 人们以为你不会被打断的。

一样一样的,你不能把空格在单词中间,即使是空白的“安全”。



Answer 3:

因为注释是在解析的词汇水平,通常被认为是空白。



Answer 4:

编译时,第一个步骤是词汇分解成单独的标记。 注释是一个类型的令牌,和运营商是另一回事。 你分裂++运算符标记以便它interpretted作为两个独立的项目。



Answer 5:

正如许多人所指出的,词法分析决定的事情怎么会变成。

让我指出一些例子:

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



文章来源: If comments are safe, then why doesn't `x = 0; x+/*cmt*/+;` or `var f/*cmt*/oo = 'foo';` work?