質問
この質問は、AntLR規則を訪問しながらオプションのトークンを区別する方法について説明します。
iは、Intによって表現されたタグに表現されたタグに、例えば215="foo"と呼ばれるAntLR4文法で定義したパーサールールを持っています。また、タグ index への割り当て、例えば215 [2]="foo"。私の質問は、割り当て規則の評価中にAntLRによって提供されるオブジェクトを見ることによって、フォーム215とフォーム215 [2]のintをどのように区別することができますか?
assign : INT '=' expr ;
INT : '-'? DIGIT+ ('[' DIGIT+ ']')?;
DIGIT : [0-9] ;
.
トークンストリームの「割り当て」ルールのパーサーの評価をキャプチャするためのvisitorメソッドを定義しました:
215 [2]="foo"
@Override
public String visitAssign(@NotNull FixRulesParser.AssignContext ctx) {
String left = ctx.getStart().getText();
String right = ctx.getStop().getText();
...
.
この時点で="215 [2]"とright="foo"
CTXオブジェクトは、割り当ての左側(215 [2])が実際にintによって定義されたオプションの '[2]'を含むかどうかを判断する方法を提供しますか?フォーム215 [2]対215の区別を区別したいです。 / P>
.Pattern p = Pattern.compile("(-?\\d+)((\\[)(\\d+)(\\]))?");
解決
1つの解決策を読んだ後に見つけた1つの解決策 "AntLRリファレンス - 第12章"は、それ自身のLexerトークンとして index "[2]"を定義し、それを別のチャネルに置きます。
assign : INT '=' expr ;
INT : '-'? DIGIT+ ;
IDX : '[' DIGIT+ ']' -> channel(TAG_INDEX);
DIGIT : [0-9] ;
.
それから私はviseAssign()で決定を下すことができます:
@Override
public String visitAssign(@NotNull FixRulesParser.AssignContext ctx) {
BufferedTokenStream tokens = tokenStream; // passed in to the constructor as arg
Token t = tokens.get(1);
int type = t.getType();
if (type == FixRulesParser.IDX) {
System.out.println("YES");
} else {
System.out.println("NO");
}
.
ここでのレッスンは、それを個別に参照する必要がある場合はIDXを他のトークンと組み合わせるべきではないと思います。
依然として私を混乱させている1つのことは、tag_indexチャネルを削除した場合です。
IDX : '[' DIGIT+ ']';
.
私は行く:4行1:4入力で実行可能な代替手段は '215 [2]'
なぜ私は解決策を持っている理由を知るのが良いでしょう。