如何检测源代码文件中每个JavaDoc块的开始行和结束行?

如何检测源代码文件中每个JavaDoc块的开始行和结束行?,java,parsing,javadoc,Java,Parsing,Javadoc,我正在创建一个解析实用程序,以读取(重复的)Java源代码文件,并在JavaDoc块中的某些点插入一些额外信息,然后重新输出它 第一步是找出每个JavaDoc块的开始和结束位置。下面是我为此编写的代码 我希望这对某些人有所帮助。这将获取Java源代码文件的路径,并输出找到的每个JavaDoc块的开始行和结束行 import java.io.File; import java.io.IOException; import java.util.regex.Pattern;

我正在创建一个解析实用程序,以读取(重复的)Java源代码文件,并在JavaDoc块中的某些点插入一些额外信息,然后重新输出它

第一步是找出每个JavaDoc块的开始和结束位置。下面是我为此编写的代码


我希望这对某些人有所帮助。

这将获取Java源代码文件的路径,并输出找到的每个JavaDoc块的开始行和结束行

   import  java.io.File;
   import  java.io.IOException;
   import  java.util.regex.Pattern;
   import  org.apache.commons.io.FileUtils;
   import  org.apache.commons.io.LineIterator;
   import  xbn.io.RTIOException;
/**
   <P>Prints the start and end line-numbers for all JavaDoc blocks in a Java source-code file. The one and only parameter is the path to the file. This assumes that the JavaDoc open-comment (slash-asterisk-asterisk) is the first non-whitespace on its line. The end comment (asterisk-slash) may be anywhere on the line.</P>

   java PrintJDBlocksStartStopLineNumsXmpl C:\java_code\PrintJDBlocksStartStopLineNumsXmpl.java
 **/
 public class PrintJDBlocksStartStopLineNumsXmpl  {
    /**
       <P>The main function.</P>
     **/
    public static final void main(String[] as_1RqdJavaSourcePath)  {

       //Read command-line parameter
          String sJPath = null;
          try  {
             sJPath = as_1RqdJavaSourcePath[0];
          }  catch(ArrayIndexOutOfBoundsException aibx)  {
             throw  new NullPointerException("Missing one-and-only required parameter: Path to java source-code file.");
          }
          System.out.println("Java source: " + sJPath);

       //Establish line-iterator
          LineIterator li = null;
          try  {
             li = FileUtils.lineIterator(new File(sJPath)); //Throws npx if null
          }  catch(IOException iox)  {
             throw  new RTIOException("PrintJDBlocksStartStopLinesXmpl", iox);
          }
          Pattern pTrmdJDBlockStart = Pattern.compile("^[\\t ]*/\\*\\*");

       String sDD = "..";
       int iLn = 1;
       boolean bInJDBlock = false;
       while(li.hasNext())  {
          String sLn = li.nextLine();
          if(!bInJDBlock)  {
             if(pTrmdJDBlockStart.matcher(sLn).matches())  {
                bInJDBlock = true;
                System.out.print(iLn + sDD);
             }
          }  else if(sLn.indexOf("*/") != -1)  {
             bInJDBlock = false;
             System.out.println(iLn);
          }
          iLn++;
       }
       if(bInJDBlock)  {
          throw  new IllegalStateException("Reach end of file. JavaDoc not closed.");
       }
    }
    /**
       <P>Another one</P>
     **/
    private static final void oneMoreForGoodMeasure()  {
    }
}

我最初的答案是创作的第一步

FilteredLineIterator
过滤另一个字符串迭代器(通常是文本文件中的行),根据存在的实体保留或丢弃每一行:“块”、“单行”和“隐藏块”实体。保留的每一行都可以更改

FilteredLineIterator
是的一部分。下载必要的JAR。)

下面的示例声明了一个“JavaDoc块”和一个“Java多行注释”。隐藏实体是必要的,以避免非JavaDoc注释块中的最后一行错误地导致“在块打开之前找到结束行”错误(因为JavaDoc和非JavaDoc注释块都以
*/
结尾)

输出:

[C:\java_code]java PrintJDBlocksStartStopLineNumsXmpl C:\java_code\PrintJDBlocksStartStopLineNumsXmpl.java
Java source: C:\java_code\PrintJDBlocksStartStopLineNumsXmpl.java
8..12
14..16
54..56
Block: 9..11
Block: 13..24
Block: 28..30
[9:BLOCK:"doccomment"] block-start
[11:BLOCK:"doccomment":active] block end
[13:BLOCK:"doccomment"] block-start
[24:BLOCK:"doccomment":active] block end
[28:BLOCK:"doccomment"] block-start
[30:BLOCK:"doccomment":active] block end
另一种方法是通过自动调试打印块行号:

BlockEntity javaDocBlock = NewBlockEntityFor.javaDocComment_Cfg(
   "doccomment",
   null,       //dbgStart
   null,       //dbgEnd
   EntityRequired.YES, null,
   System.out).   //<--Automated line-number debugging
   keepAll().build();

FilteredLineIterator filteredItr = new FilteredLineIterator...

while(filteredItr.hasNext())  {
   filteredItr.next();
} 
输入文件:

/*
   Not a JavaDoc block. The following sub-mode is ignored, because it's not in a JavaDoc block.

      //sub-mode...START

      //sub-mode...END
 */
package  fully.qualified.package.name;
/**
  <P>A JavaDoc block</P>
 */
public class StayClassy  {
   /**
      <P>Another JavaDoc block</P>

      <P>info</P>        //sub-mode...START

      <P>info</P>

      <P>info</P>        //sub-mode...END

      <P>info</P>

    */
   public StayClassy()  {
      //Do stuff
   }
   /**
     <P>Does stuff.</P>
    */
   public void doStuff()  {
   }
}
/*
不是JavaDoc块。忽略以下子模式,因为它不在JavaDoc块中。
//子模式…启动
//子模式…结束
*/
package full.qualified.package.name;
/**

JavaDoc块

*/ 公共级Stayclass{ /**

另一个JavaDoc块

信息

//子模式…启动

信息

信息

//子模式…结束

信息

*/ 公共服务{ //做事 } /**

做一些事情。

*/ 公共空间{ } }
[9:BLOCK:"doccomment"] block-start
[11:BLOCK:"doccomment":active] block end
[13:BLOCK:"doccomment"] block-start
[24:BLOCK:"doccomment":active] block end
[28:BLOCK:"doccomment"] block-start
[30:BLOCK:"doccomment":active] block end
/*
   Not a JavaDoc block. The following sub-mode is ignored, because it's not in a JavaDoc block.

      //sub-mode...START

      //sub-mode...END
 */
package  fully.qualified.package.name;
/**
  <P>A JavaDoc block</P>
 */
public class StayClassy  {
   /**
      <P>Another JavaDoc block</P>

      <P>info</P>        //sub-mode...START

      <P>info</P>

      <P>info</P>        //sub-mode...END

      <P>info</P>

    */
   public StayClassy()  {
      //Do stuff
   }
   /**
     <P>Does stuff.</P>
    */
   public void doStuff()  {
   }
}