如何检测源代码文件中每个JavaDoc块的开始行和结束行?
我正在创建一个解析实用程序,以读取(重复的)Java源代码文件,并在JavaDoc块中的某些点插入一些额外信息,然后重新输出它 第一步是找出每个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块的开始行和结束行
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() {
}
}