【问题标题】:Is /a/g in {}/a/g a regex or a division?{}/a/g 中的 /a/g 是正则表达式还是除法?
【发布时间】:2014-11-24 10:35:41
【问题描述】:

我正在写一个JavaCC-based parser for JavaScript (ECMAScript 5.1) 并且有一个带有正则表达式的有趣的极端情况。在这里。

考虑以下语句:

{}/a/g

我的问题:从规范的角度来看,是否应该解释为

  • ObjectLiteral 除以Identifier a 除以Identifier b
  • Block 后跟 RegularExpressionLiteral /a/g?

例如,Chrome 将其解释为后者以及其他解析器。

从规范的角度看,{}/a/g 中的/a/g 是正则表达式还是除法?

这是我认为是规范的relevant part

没有句法文法上下文,其中两个前导 或除法分配,以及前导的正则表达式文字是 允许。

relevant question 上引用another answer

除法运算符必须跟在表达式后面,而正则 表达式文字不能跟随表达式,所以在所有其他情况下 您可以放心地假设您正在查看正则表达式文字。

我的理解是{}一个表达式。 ObjectLiteral,即使是空的也是PrimaryExpression。所以下面的/a/g 一定是除法,而不是正则表达式字面量。

还是我错了?

【问题讨论】:

  • 是什么让您认为 {} 是一个表达式,或者这只是一个语句?左大括号通常被解释为块的开始。

标签: javascript regex grammar language-lawyer ecmascript-5


【解决方案1】:

不,{} 在这种情况下不是表达式。引用注释标准的相关部分:http://es5.github.io/#x12.4ExpressionStatement 不能以左大括号开头,因为这可能会使它与Block 混淆”。在您的情况下,{}/a/g 是一个块,后跟一个由正则表达式文字组成的表达式语句。

【讨论】:

  • 酷,这就是我所缺少的。
猜你喜欢
  • 2015-01-07
  • 2011-08-28
  • 2016-12-07
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 2014-04-23
  • 2012-08-21
  • 2021-11-03
相关资源
最近更新 更多