短い質問があります:
// Lexer
LOOP_NAME : (LETTER|DIGIT)+;
OTHERCHARS : ~('>' | '}')+;
LETTER : ('A'..'Z')|('a'..'z');
DIGIT : ('0'..'9');
A_ELEMENT
: (LETTER|'_')*(LETTER|DIGIT|'_'|'.');
// Parser-Konfiguration
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
私の問題は、次の理由でこれが不可能であることです。
その結果、代替 2 はその入力に対して無効になりました [14:55:32] エラー (208): ltxt2.g:61:1: 前のトークンが同じ入力に一致するため、次のトークン定義は一致しません:文字、数字、A_ELEMENT、WS
私の問題は、UTF8 を OTHERCHARS でキャッチする必要があることです...そして、("!".."?") のように範囲を指定できないため、特別な UTF8 文字をすべて Lexer ルールに入れることはできません。
したがって、NOT (~) が必要です。ここの OTHERCHARS には、">" または "}" 以外のすべてを指定できます。これら 2 つは文字通りの文脈を閉じており、内部では禁止されています。
このような事例はあまり参考にされていないようですので、どなたか回避策をご存じの方がいらっしゃれば幸いです。ここでの NOT 演算子は、解決する必要があるアンビバレンスを作成します。
前もって感謝します。
ベストウィッシュ