查看 Bart Kiers here的评论中提到的语法,您可以看到这条评论,
定义这种语法面临的主要挑战是:
-1- 与乘法表达式和正则表达式文字相关的 DIV 符号周围的歧义。这可以通过一些词法分析器驱动的魔法来解决:门控语义谓词根据 RegularExpressionsEnabled 属性的值打开或关闭正则表达式的识别。启用正则表达式时,它们优先于除法表达式。是否启用正则表达式的决定是基于前一个标记可以被认为是除法左侧操作数的最后一个标记的启发式方法。
...
areRegularExpressionsEnabled() 函数定义为,
private final boolean areRegularExpressionsEnabled()
{
if (last == null)
{
return true;
}
switch (last.getType())
{
// identifier
case Identifier:
// literals
case NULL:
case TRUE:
case FALSE:
case THIS:
case OctalIntegerLiteral:
case DecimalLiteral:
case HexIntegerLiteral:
case StringLiteral:
// member access ending
case RBRACK:
// function call or nested expression ending
case RPAREN:
return false;
// otherwise OK
default:
return true;
}
}
然后在RegularExpressionLiteral表达式中使用该函数,
RegularExpressionLiteral
: { areRegularExpressionsEnabled() }?=> DIV RegularExpressionFirstChar RegularExpressionChar* DIV IdentifierPart*
;