6

後で分析するために Java ソース ファイルを AST に解析する ANTLR で文法を書いています。他のパーサー (JavaDoc など) とは異なり、すべてのコメントを保持しようとしています。これは、コード内のどこでも文字どおりコメントを使用できるというのが難しいことです。コメントがソース コードのどこかに文法と一致しない場合、ANTLR はファイルの解析を完了できません。

ANTLR が見つけたコメントを自動的に AST に追加する方法はありますか? lexer は、いずれ{skip();}かを使用するか、非表示のチャネルにテキストを送信することによって、すべてのコメントを単純に無視できることを知っています。これらのオプションのいずれかを設定すると、ANTLR は問題なくファイルを解析します。

どんなアイデアでも大歓迎です。

4

6 に答える 6

8

最初: すべてのコメントを特定のチャネルに転送します (コメントのみ)

COMMENT
    : '/*' .*? '*/' -> channel(2)
    ;

LINE_COMMENT
    : '//' ~[\r\n]* -> channel(2)
    ;

2 番目: すべてのコメントを出力する

      CommonTokenStream tokens = new CommonTokenStream(lexer);
      tokens.fill();
      for (int index = 0; index < tokens.size(); index++)
      {
         Token token = tokens.get(index);
         // substitute whatever parser you have
         if (token.getType() != Parser.WS) 
         {
            String out = "";
            // Comments will be printed as channel 2 (configured in .g4 grammar file)
            out += "Channel: " + token.getChannel();
            out += " Type: " + token.getType();
            out += " Hidden: ";
            List<Token> hiddenTokensToLeft = tokens.getHiddenTokensToLeft(index);
            for (int i = 0; hiddenTokensToLeft != null && i < hiddenTokensToLeft.size(); i++)
            {
               if (hiddenTokensToLeft.get(i).getType() != IDLParser.WS)
               {
                  out += "\n\t" + i + ":";
                  out += "\n\tChannel: " + hiddenTokensToLeft.get(i).getChannel() + "  Type: " + hiddenTokensToLeft.get(i).getType();
                  out += hiddenTokensToLeft.get(i).getText().replaceAll("\\s", "");
               }
            }
            out += token.getText().replaceAll("\\s", "");
            System.out.println(out);
         }
      }
于 2016-05-16T11:27:33.203 に答える
7

ANTLRが見つけたコメントをASTに自動的に追加する方法はありますか?

commentsいいえ、コメントが発生する可能性のあるすべての有効な場所を説明するために、文法全体に追加のルールを振りかける必要があります。

...

if_stat
 : 'if' comments '(' comments expr comments ')' comments ...
 ;

...

comments
 : (SingleLineComment | MultiLineComment)*
 ;

SingleLineComment
 : '//' ~('\r' | '\n')*
 ;

MultiLineComment
 : '/*' .* '*/'
 ;
于 2012-09-19T06:29:35.477 に答える
1

機能「島文法」も使用できます。ANTLR4 ブックの次のセクションを参照してください。

Island Grammars: 同じファイルで異なる形式を扱う

于 2015-08-03T11:00:58.260 に答える