这个线程启发的问题。 下面是代码样本一次。 我在寻找告诉到底是怎么回事,就答案。
两个x = 0; x+/*cmt*/+;
x = 0; x+/*cmt*/+;
和var f/*cmt*/oo = 'foo';
产生语法错误,这使得在回答这个问题的错误。
这个线程启发的问题。 下面是代码样本一次。 我在寻找告诉到底是怎么回事,就答案。
两个x = 0; x+/*cmt*/+;
x = 0; x+/*cmt*/+;
和var f/*cmt*/oo = 'foo';
产生语法错误,这使得在回答这个问题的错误。
从ECMAScript的参考 :
评论表现得像空白和被丢弃,只是,如果MultiLineComment包含行终止符,则整个注释被认为是由句法语法分析的目的的LineTerminator。
你打断一个字,而不是一个句子。 ++和Foo是的话。 人们以为你不会被打断的。
一样一样的,你不能把空格在单词中间,即使是空白的“安全”。
因为注释是在解析的词汇水平,通常被认为是空白。
编译时,第一个步骤是词汇分解成单独的标记。 注释是一个类型的令牌,和运营商是另一回事。 你分裂++运算符标记以便它interpretted作为两个独立的项目。
正如许多人所指出的,词法分析决定的事情怎么会变成。
让我指出一些例子:
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