ANTLR 4 の別のチャンネルにコメントを含めました。私の場合はチャンネル 2 です。
これが私のレクサー文法です。
COMMENT: '/*' .*? '*/' -> channel(2)
;
このチャネル 2 にアクセスして、このチャネルで解析を行い、コメントを蓄積したいと考えています。だから私は以下のように文法を解析するようにそれを含めました:
comment
:COMMENT
;
プログラムでは
string s = " paring string"
AntlrInputStream input = new AntlrInputStream(s);
CSSLexer lexer = new CSSLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer,2);
次に、トークンの解析を行いたい
var xr = parser.comment().GetRuleContexts<CommentContext>();
Start.Column
などの CommentContext オブジェクトから情報を取得したいためです。
編集:
これは改善された質問です
より具体的には、チャネル 2 のすべてのトークンを取得し、コメント文法を使用してそれらを解析して、すべてのコメントを list( IReadOnly<CommentContext>
) に取得し、これらのそれぞれを反復処理して、開始行、開始行などの情報にアクセスできるようにします。開始列、終了行終了列、およびトークン テキスト。
CommonTokenStream tokens = new CommonTokenStream(lexer,2);
これは、チャネル 2 のトークンを私に与えていません。そして、私が発見したもう 1 つのことは、これらのトークンが引数としてパーサー コンストラクトに渡されるまでです。XParser parser = new XParser(tokens);
その後、私だけが を呼び出してトークンにアクセスできます。トークンGetTokens()
には、トークンとして識別されたコメントがあり、チャンネル 2 にあることがわかりますCommentTokenStrem
。上記のようにチャンネル番号を指定しても。すべてのトークンが含まれています。
トークンを使用してパーサー オブジェクトが作成されるまで、トークンにアクセスできない理由は何ですか?
チャネル 2 でを取得
CommentTokenStrem
し、XParser オブジェクトの作成に を渡して、comment
文法を使用してこれらのトークンを解析したいと考えています。ANTLR 4 API でこれを行う最善の方法は何ですか?