9

我有一个 ANTLR JavaScript 语法(取自互联网),它似乎支持除正则表达式文字之外的所有内容。

正则表达式文字的问题在于您有两个规则,本质上是:

multiplicativeExpression
    : unaryExpression (LT!* ('*' | '/' | '%')^ LT!* unaryExpression)*

regexLiteral
    : '/' RegexLiteralChar* '/'

其中规则 RegexLiteralChar 使用与普通表达式不同的词法分析器规则(例如,双引号不会终止它)。

这意味着我需要以某种方式从我的解析器中更改某种词法分析器状态。我怎样才能做到这一点?甚至可能吗?

4

1 回答 1

5

查看 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*
    ;
于 2012-09-03T05:28:34.790 回答