this question私は任意のテキストからタグを抽出することについて尋ねました。提供されたソリューションはうまくいきましたが、私が処理したい1つのエッジケースがあります。要約すると、ユーザが入力した任意のテキストを解析しており、有効なタグ構文に一致するように<
または>
が出現したいと考えています。角括弧が有効なタグの一部でない場合は、<
または>
のようにエスケープする必要があります。私が探している構文は<foo#123>
です。ここで、foo
は固定のエントリリストのテキストで、123
は数字[0-9]+
です。パーサ:antlr文法回避角括弧
parser grammar TagsParser;
options {
tokenVocab = TagsLexer;
}
parse: (tag | text)* EOF;
tag: LANGLE fixedlist GRIDLET ID RANGLE;
text: NOANGLE;
fixedlist: FOO | BAR | BAZ;
レクサー:
lexer grammar TagsLexer;
LANGLE: '<' -> pushMode(tag);
NOANGLE: ~[<>]+;
mode tag:
RANGLE: '>' -> popMode;
GRIDLET: '#';
FOO: 'foo';
BAR: 'bar';
BAZ: 'baz';
ID: [0-9]+;
OTHERTEXT: . ;
これがうまく機能し、正常のようなテキストを解析:
:私はBailErrorStrategy
を使用する場合
<foo#123>
Hi <bar#987>!
<baz#1><foo#2>anythinghere<baz#3>
if 1 < 2
また成功し、次の失敗
<foo123>
<bar#a>
<foo#123H>
<unsupported#123>
if 1 < 2
<
がtag
モードに入り、サポートされているタグ形式と一致しないため、最後の1つは正常に失敗します。しかし、私はまた、以下も同様に失敗する必要がありますので、同様にテキストで>
のインスタンスを避けたい:
if 2 > 1
テキストではなく、生のアングルブラケットを持つのif 2 > 1
として指定する必要があること。
有効なタグに含まれていない>
の出現が解析できないように、どのように文法を変更できますか?
あなたの文法は今や '> 'タグの外にあるので、'タグ 'モード以外のレクサー文法のどこにも現れないので、トークンの認識エラーが発生します。十分ではありませんか? –