1

JavaCC のレクサーにフックして、関数を呼び出して文字が有効かどうかを確認できるかどうか疑問に思っていました。

私が尋ねている理由は、次のようなものを実装しようとしているためです。

TOKEN {
    <ID: id($char)>
}

id() は次のとおりです。

//Check to see if the character is an ID character
boolean id(char currentCharacter) {
    int type = Character.getType(currentCharacter);

    return type == Character.LOWERCASE_LETTER || type == Character.MATH_SYMBOL;
}

これはまったく可能ですか?

4

1 に答える 1

4

いいえ、できません。レクサーは有限状態マシンです。

実行できることは、一致した文字列の文字を検証し、その検証の結果を発行されたトークンに追加する字句アクションを実装することです(たとえば、カスタムフィールドの値を設定することによって)。ただし、検証の結果を使用してレクサーをガイドすることはできません。

IDトークンは、可能なすべての文字の列挙として定義する必要があります。

TOKEN {
    < ID: [ "a"-"z", "α"-"ω", ... ] > // The enumeration is to be continued
}

注: Unicodeエスケープを使用しない場合は、JavaCCに文法ファイルの正確なエンコーディングを伝えることを忘れないでください。

これは面倒ですが、レクサーの動作方法です。

別の方法は、任意の1文字を識別子として受け入れ、パーサーで検証するか、後で検証することです。

TOKEN {
    < ID: ~[] >
}

しかし、そうする理由はありません。

于 2011-06-01T16:22:52.313 に答える