我正在写一个 JavaCC-based parser for JavaScript ( ECMAScript 5.1 ) 并且有一个有趣的正则表达式极端案例。在这里。
考虑以下语句:
{}/a/g
我的问题:从规范的 Angular 来看,是否应该解释为
ObjectLiteral
除以Identifier a
除以Identifier b
或Block
后跟RegularExpressionLiteral/a/g
?
例如,Chrome 将其解释为后者和其他解析器。
从规范的 Angular 来看,{}/a/g
中的/a/g
是regex还是division?
这是我认为的 relevant part规范:
There are no syntactic grammar contexts where both a leading division or division-assignment, and a leading RegularExpressionLiteral are permitted.
引用 another answer在 relevant question 上:
The division operator must follow an expression, and a regular expression literal can't follow an expression, so in all other cases you can safely assume you're looking at a regular expression literal.
我的理解是 {}
是一个表达式。 ObjectLiteral , 即使是空的也是 PrimaryExpression .所以后面的/a/g
一定是除法,不是正则表达式字面量。
还是我错了?
最佳答案
不,{}
在这种情况下不是表达式。引用注释标准的相关部分:http://es5.github.io/#x12.4 “ExpressionStatement
不能以左大括号开头,因为这可能会使它与 Block
产生歧义”。在您的情况下,{}/a/g
是一个 block ,后跟由正则表达式文字组成的表达式语句。
关于javascript - {}/a/g 中的/a/g 是正则表达式还是除法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27102746/