26

ParserVisitor でより具体的なエラー メッセージの行番号を取得しようとしています (antlr によって生成された解析ツリーにアクセスします)。ただし、このクラスにあるのは contextctxだけで、 のようなことはできますが、できませctx.getText()getLine()。これを行う方法はありますか?

ctx.getPayload()ここで使える?もしそうなら、どのように?

編集: ANTLR 4 を使用して Java ファイルを作成しています。

次のような方法で、ビジターの行番号にアクセスしようとしています。

@Override 
public Type visitStatAssign(@NotNull BasicParser.StatAssignContext ctx) {
...
// some semantic error detected
int lineNo = ...
System.err.("Semantic error at line " + lineNo); 
}

編集 2: 私のレクサーとパーサーのルールはかなり標準的です。たとえば、レクサーでは次のようになります。

INT : 'int' ;
CHAR : 'char' ;
BOOL : 'bool' ;
STRING : 'string' ; 

...はパーサー ルールの baseType にあります。

baseType : INT | CHAR | BOOL | STRING ; 
4

3 に答える 3

16

ctx.getSourceInterval()ルールによって消費されるトークンの範囲を取得するために使用できます。を使用TokenStream.get(int index)して、ソース間隔に関連付けられたトークンを取得し、トークンから位置情報を取得できます。

Interval sourceInterval = ctx.getSourceInterval();
Token firstToken = commonTokenStream.get(sourceInterval.a);
int line = firstToken.getLine();
于 2013-11-05T22:01:54.407 に答える