我正在编写一个基于JavaCC的JavaScript解析器 (ECMAScript 5.1),并且有一个有趣的带有正则表达式的角落案例。这就是了。
考虑以下声明:
{}/a/g我的问题是:从规范的角度来看,它是否应该被解释为
ObjectLiteral除以Identifier a除以Identifier b或Block接RegularExpressionLiteral /a/g例如,Chrome将其解释为后者和其他解析器。
从规范的角度来看,/a/g in {}/a/g 是一个规范还是一个部门?
下面是我认为是规范的相关部分:
在语法上下文中,不允许使用领先的划分或除法分配,也不允许使用领先的RegularExpressionLiteral。
除法运算符必须跟随表达式,而正则表达式文字不能跟随表达式,因此在所有其他情况下,您可以安全地假定您正在查看正则表达式文字。
我的理解是,{}是一个表达式。ObjectLiteral,即使是空的也是PrimaryExpression。因此,下面的/a/g必须是一个除法,而不是正则表达式文字。
还是我错了?
发布于 2014-11-24 11:15:44
不,在这种情况下,{}不是表达式。引用了带注释的标准的相关部分:http://es5.github.io/#x12.4:“ExpressionStatement不能以开头的大括号开头,因为这可能会使它与Block产生歧义”。在您的示例中,{}/a/g是一个块,后面跟着一个由正则表达式文字组成的表达式语句。
https://stackoverflow.com/questions/27102746
复制相似问题