AntLRルールを訪問しながらオプションのトークンを区別します

StackOverflow https://stackoverflow.com//questions/20014741

  •  21-12-2019
  •  | 
  •  

質問

この質問は、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]'

なぜ私は解決策を持っている理由を知るのが良いでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top