尝试从java源文件中解析出类、方法、属性等信息,但下面的代码没有完全实现。
Sub parseJava() Dim package_name as String 'read a file Documents.Open FileName:="f:CommandCm.java", ConfirmConversions:=False, ReadOnly:=True paraNo = ActiveDocument.Paragraphs.Count For lineNo = 1 To paraNo Set curParaWords = ActiveDocument.Paragraphs(lineNo).Range.Words Dim strCurPara as String strCurPara = ActiveDocument.Paragraphs(lineNo).Range.Text If InStr(strCurPara, "package")=1 Then '包名是package后、分号前的部分 tmpStr = Right(strCurPara,Len(strCurPara)-Len("package")-1) package_name = Left(tmpStr, Len(tmpStr)-2) End If If InStr(strCurPara, "public class")=1 Then '类名是这一行的第三个单词,且不含末尾空格 class_name = RTrim(curParaWords(3).Text) End If If InStr(strCurPara, "public interface")=1 Then '接口名是这一行的第三个单词,且不含末尾空格 class_name = RTrim(curParaWords(3).Text) End If Select Case curParaWords(2).Text Case "public"
Case "private" Case "protected" Case Else End Case If curParaWords(2)="public" Then '接口名是这一行的第三个单词,且不含末尾空格 class_name = RTrim(ActiveDocument.Paragraphs(lineNo).Range.Words(3).Text) End If Next lineNo ActiveDocument.Close End Sub
下面是业务逻辑:
数据结构:
类相关数据表ClassInfo(Map)
key: name, description, class_name, package, extends, interface;
属性数据表PropInfo(List
方法数据表MethodInfo(List
文本格式约定:
顶格、package起首代码行为package声明行;
顶格、public class起首的代码行是类声明行;
顶格、 public interface起首的代码行是接口声明行;
一个tab后跟public、private、protected是方法或者属性
有左括号的是方法, 左括号前单词是方法名,方法名前是返回值的数据类型;
无左括号 的是 属性,等号左边单词是属性名,若无等号分号前单词是属性名,若都没有输出一条 “文件名:行号:异常属性/方法,手工提取” 提示;
一个tab后跟其他字母 输出一条“文件名:行号:异常属性/方法,手工提取”提示;
一个tab后跟非字母符号(如/*是注释,@是编译标志)略过;
流程:
用户输入目标目录
将文件名保存在ClassInfo.name和class_name中;
加载该目录下所有java文件, 对于一个java文件:
第一次文本逐行读取:提取除方法/属性说明外所有信息;
第二次文本逐行读取:寻找以“* 方法名”开始的行,作为方法说明,放入对应的方法Map中;