9

私はANTLRJavaScript文法(インターネットから取得)を持っています。これは、正規表現リテラルを除くすべてをサポートしているようです。

正規表現リテラルの問題は、基本的に2つのルールがあることです。

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

regexLiteral
    : '/' RegexLiteralChar* '/'

ここで、ルールRegexLiteralCharは、通常の式とは異なるレクサールールを使用します(たとえば、二重引用符はそれを終了しません)。

これは、何らかの方法で、パーサーからある種のレクサー状態を変更する必要があることを意味します。これどうやってするの?それも可能ですか?

4

1 に答える 1

5

ここでバート・キアーズのコメントに記載されている文法を見ると、このコメントを見ることができます、

この文法を定義する際に直面した主な課題は次のとおりです。

-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 に答える