CN102855306B - 一种解析源文件的方法和装置 - Google Patents
一种解析源文件的方法和装置 Download PDFInfo
- Publication number
- CN102855306B CN102855306B CN201210299029.5A CN201210299029A CN102855306B CN 102855306 B CN102855306 B CN 102855306B CN 201210299029 A CN201210299029 A CN 201210299029A CN 102855306 B CN102855306 B CN 102855306B
- Authority
- CN
- China
- Prior art keywords
- string
- current string
- current
- described current
- character string
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Machine Translation (AREA)
Abstract
本发明公开一种解析源文件的方法和装置,该方法包括以下步骤:A1、打开源文件,将所述源文件的起始位置作为当前位置;A2、从当前位置向后读取一行字符串;A3、判断是否读取成功,如果成功,则执行步骤A4;否则,将缓冲区中的内容写入目标文件;A4、将读取到的一行字符串作为当前字符串,并将所述当前位置更新为位于所述当前字符串之后且与所述当前字符串相邻的位置;A5、对所述当前字符串进行判断,根据判断结果对包括所述当前字符串在内的至少一条字符串进行解析,将解析结果写入缓冲区,并返回步骤A2。本发明通过解析源文件,将现有的伺服类库模式转换成简洁模式,从而避免将源代码直接显示给用户,提高了源文件的安全性和可读性。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种解析源文件的方法和装置。
背景技术
现有技术中,Java虚拟机上运行的Java程序包括被装载的class文件和已经装载的动态库。当运行Java程序时,查看伺服类库需要有class文件和对应的扩展名为.java的源文件。
发明人在实现本发明的过程中,发现现有技术至少存在以下缺陷:
现有技术中,显示给用户的源文件通常为源代码,无法保障源文件的安全性。
发明内容
本发明提供了一种解析源文件的方法和装置,以解决现有技术中源代码容易泄露的缺陷。
本发明提供了一种解析源文件的方法,包括以下步骤:
A1、打开源文件,将所述源文件的起始位置作为当前位置;
A2、从当前位置向后读取一行字符串;
A3、判断是否读取成功,如果成功,则执行步骤A4;否则,执行步骤A11;
A4、将读取到的一行字符串作为当前字符串,并将所述当前位置更新为位于所述当前字符串之后且与所述当前字符串相邻的位置;
A5、对所述当前字符串进行判断,如果所述当前字符串为注释字符串,则执行步骤A6;如果所述当前字符串为空行,则执行步骤A7;如果所述当前字符串不是注释字符串或者空行,但包含注释信息,则执行步骤A8;如果所述当前字符串不是注释字符串或者空行,也不包含注释信息,则执行步骤A10;
A6、将包括所述当前字符串在内的至少一条字符串作为注释字符串进行解析,将解析结果写入缓冲区,并返回步骤A2;
A7、将所述当前字符串写入缓冲区,并返回步骤A2;
A8、将当前字符串更新为所述当前字符串中除注释信息之外的其他内容;
A9、将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并返回步骤A2;
A10、将包括当前字符串在内的至少一条字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并返回步骤A2;
A11、将缓冲区中的内容写入目标文件。
本发明还提供了一种解析源文件的装置,包括初始化模块、读取模块、第一判断模块、第一更新模块、第二更新模块、第二判断模块、第一解析模块、第二解析模块、第三解析模块、第四解析模块和写入模块,其中,
所述初始化模块,用于打开源文件,将所述源文件的起始位置作为当前位置,并触发所述读取模块;
所述读取模块,用于从当前位置向后读取一行字符串;
所述第一判断模块,用于判断所述读取模块是否读取成功;
所述第一更新模块,用于在所述第一判断模块判断读取成功时,将读取到的一行字符串作为当前字符串,并将所述当前位置更新为位于所述当前字符串之后且与所述当前字符串相邻的位置,并触发所述第二判断模块;
所述第二判断模块,用于对所述当前字符串进行判断;
所述第一解析模块,用于在所述第二判断模块判断所述当前字符串为注释字符串时,将包括所述当前字符串在内的至少一条字符串作为注释字符串进行解析,将解析结果写入缓冲区,并触发所述读取模块;
所述第二解析模块,用于在所述第二判断模块判断所述当前字符串为空行时,将所述当前字符串写入缓冲区,并触发所述读取模块;
所述第二更新模块,用于在所述第二判断模块判断所述当前字符串不是注释字符串或者空行,但包含注释信息时,用于将当前字符串更新为所述当前字符串中除注释信息之外的其他内容,并触发所述第三解析模块;
所述第三解析模块,用于将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并触发所述读取模块;
所述第四解析模块,用于在所述第二判断模块判断所述当前字符串不是注释字符串或者空行,也不包含注释信息时,将包括当前字符串在内的至少一条字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并触发所述读取模块;
所述写入模块,用于在所述第一判断模块判断读取失败时,将缓冲区中的内容写入目标文件。
本发明实施例通过解析源文件,将解析结果写入目标文件,将现有的伺服类库模式转换成简洁模式,从而避免将源代码直接显示给用户,提高了源文件的安全性和可读性。
附图说明
图1为本发明实施例中的一种对源路径下的源文件进行查找和解析的方法流程图;
图2为本发明实施例中的一种解析源文件的方法流程图;
图3为本发明实施例中的一种解析源文件中的注释字符串的方法流程图;
图4为本发明实施例中的一种解析源文件中的非注释字符串的方法流程图;
图5为本发明实施例中的一种解析源文件中的类中的字符串的方法流程图;
图6为本发明实施例中的一种解析源文件中的接口中的字符串的方法流程图;
图7-1、7-2为本发明实施例中的一种解析源文件中的接口体中的字符串的方法流程图;
图8为本发明实施例中的一种解析源文件中的方法的方法流程图;
图9-1、9-2为本发明实施例中的一种解析源文件中的普通方法的方法流程图;
图10为本发明实施例中的一种解析源文件中的特殊方法的方法流程图;
图11为本发明实施例中的一种解析源文件中的变量的方法流程图;
图12为本发明实施例中的一种解析源文件中的无用对象的方法流程图;
图13为本发明实施例中的一种解析源文件中的包含特殊字段的字符串的方法流程图;
图14为本发明实施例中的一种解析源文件的装置结构图;
图15为本发明实施例中的一种解析源文件的装置中的第一解析模块的结构示意图;
图16为本发明实施例中的一种解析源文件的装置中的第三解析模块、第四解析模块和第三解析子模块的结构示意图;
图17为本发明实施例中的一种解析源文件的装置中的第四解析单元的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1
本实施例提供了一种对源路径下的源文件进行查找和解析的方法,如图1所示,包括以下步骤:
步骤101,获取源文件的源路径和目标文件所在的目标路径。
其中,源路径为源文件的存储位置,目标文件用于存储对源文件的解析结果,目标路径为目标文件的存储位置。
步骤102,判断源路径是否存在,如果存在,则执行步骤103;否则,结束流程。
步骤103,将源路径作为当前路径,在当前路径中查找未被处理过的对象。
其中,对象可以为文件,也可以为目录。
步骤104,判断是否查找到未被处理过的对象,如果查找到,则执行步骤105;否则,执行步骤112。
步骤105,判断查找到的对象是否为目录,如果是,则执行步骤106;否则,执行步骤107。
步骤106,在目标路径下创建与查找到的目录名称相同的目录,将目标路径+创建的目录作为更新后的目标路径,将当前路径+查找到的目录作为更新后的当前路径,在更新后的当前路径中查找对象,并执行步骤104。
步骤107,判断查找到的对象是否为文件,如果是,则执行步骤109;否则,执行步骤108。
步骤108,在当前路径中查找对象,并返回步骤104。
步骤109,判断查找到的文件是否为.java结尾的文件,如果是,则执行步骤111;否则,执行步骤110。
步骤110,在当前路径中查找对象,并返回步骤104。
步骤111,将查找到的文件作为源文件进行解析,将解析结果写入目标路径下的目标文件,在当前路径中查找对象,并返回步骤104。
步骤112,判断当前路径是否为源路径,如果是,则结束流程;否则,执行步骤113。
步骤113,将目标路径的上一级目录路径作为更新后的目标路径,将当前路径的上一级目录路径作为更新后的当前路径,在更新后的当前路径中查找对象,并执行步骤104。
上述实施例中的步骤111可细化为如图2所示的流程图,包括以下步骤:
步骤201,打开源文件,将该源文件的起始位置作为当前位置。
步骤202,从当前位置向后读取一行字符串。
步骤203,判断是否读取成功,如果成功,则执行步骤204;否则,执行步骤213。
步骤204,将读取到的一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤205,判断当前字符串是否为注释字符串,如果是,则执行步骤206;否则,执行步骤207。
具体地,可以判断当前字符串是否满足以下条件:
1. 当前字符串包含第一预设字符串;
2. 当前字符串不包含位于第一预设字符串之前的字符串;
如果当前字符串同时满足上述两个条件,则确定当前字符串为注释字符串;否则,则确定当前字符串不是注释字符串。
其中,第一预设字符串可以是“/*”,也可以是“/*”加空格,即“/* ”;也可以是“//”,还可以是“//”加空格,即“// ”。
步骤206,将包括当前字符串在内的至少一条字符串作为注释字符串进行解析,将解析结果写入缓冲区,并返回步骤202。
其中,缓冲区用于存储对源文件的解析结果,其初始存储的内容为空。
步骤207,判断当前字符串是否为空行,如果是,则执行步骤208;否则执行步骤209。
步骤208,将当前字符串写入缓冲区,并返回步骤202。
步骤209,判断当前字符串中是否包含注释信息,如果包含,则执行步骤210;否则,执行步骤212。
具体地,可以判断当前字符串中是否包含第一预设字符串,如果包含,则确定当前字符串包含注释信息;否则,确定当前字符串不包含注释信息。
步骤210,将当前字符串更新为当前字符串中除注释信息之外的其他内容。
步骤211,将当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并返回步骤202。
其中,注释信息为第一预设字符串以及当前字符串中位于第一预设字符串之后的字符串。
步骤212,将包括当前字符串在内的至少一条字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并返回步骤202。
步骤213,关闭源文件,将缓冲区中的内容写入目标文件,并清空缓冲区。
上述实施例的步骤206可细化为如图3所示的流程图,包括以下步骤:
步骤301,将第一偏移量清零。
其中,第一偏移量用于标识当最近一次写入缓冲区的内容为注释信息时,该注释信息在缓冲区中的起始位置相对于缓冲区的首地址的偏移量。
步骤302,判断当前字符串是否包含第二预设字符串,如果包含,则执行步骤303;否则,执行步骤312。
其中,第二预设字符串可以是“/*”,也可以是“/*”加空格,即“/* ”。
步骤303,判断当前字符串是否包含第三预设字符串,如果包含,则执行步骤308;否则,执行步骤304。
其中,第三预设字符串可以是“*/”,也可以是空格加“*/”,即“*/”。
步骤304,将第一偏移量的取值赋值为第二偏移量的取值,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
其中,第二偏移量用于标识最近一次写入缓冲区的解析结果在缓冲区中的结束位置相对于缓冲区的首地址的偏移量。
步骤305,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤306,判断当前字符串是否包含位于首尾的空格,如果包含,则执行步骤307;否则,返回步骤303。
其中,位于首尾的空格,可以是位于首部的空格,也可以是位于尾部的空格。
步骤307,将位于当前字符串的首尾的空格删除,并返回步骤303。
步骤308,判断当前字符串中是否存在位于第三预设字符串之后的字符串,如果存在,则执行步骤309;否则,执行步骤312。
步骤309,将第一偏移量的取值赋值为第二偏移量的取值,将当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串作为解析结果写入缓冲区,获取当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串的长度之和,将第二偏移量的取值自加该长度之和。
步骤310,将当前字符串更新为当前字符串中位于第三预设字符串之后的字符串。
步骤311,将当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并返回步骤202。
步骤312,将第一偏移量的取值赋值为第二偏移量的取值,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度,并返回步骤202。
上述实施例中的步骤211、步骤212和步骤311中所述对非注释字符串进行解析的过程,可细化为如图4所示的流程图,包括以下步骤:
步骤401,判断当前字符串是否包含第四预设字符串,如果包含,则执行步骤402;否则,执行步骤403。
其中,第四预设字符串可以为“package”加空格,即“package ”,也可以为“import”加空格,即“import ”。
步骤402,将包括当前字符串在内的至少一条字符串作为包含特殊字段的字符串进行解析,将解析结果写入缓冲区,将第一偏移量清零,并返回步骤202。
步骤403,判断当前字符串是否包含第五预设字符串,如果包含,则执行步骤404;否则,执行步骤411。
其中,第五预设字符串可以为“public”加空格,即“public ”,也可以为“protected”加空格,即“protected ”。
步骤404,判断当前字符串是否包含“class ”(“class”加空格),如果包含,则执行步骤405;否则,执行步骤406。
步骤405,将包括当前字符串在内的至少一条字符串作为类中的字符串进行解析,将解析结果写入缓冲区,将第一偏移量清零,并返回步骤202。
步骤406,判断当前字符串是否包含“interface ”(“interface”加空格),如果包含,则执行步骤407;否则,执行步骤408;
步骤407,将包括当前字符串在内的至少一条字符串作为接口中的字符串进行解析,将解析结果写入缓冲区,将第一偏移量清零,并返回步骤202。
步骤408,判断当前字符串是否为方法中的字符串,如果是,则执行步骤409;否则,执行步骤410。
具体地,可以判断当前字符串是否满足以下条件:
1.包含“(”,且不包含“=”;
2.包含“(”、“=”和“{”;
如果当前字符串满足以上条件中的任一条,则确定当前字符串为方法中的字符串;如果当前字符串不满足以上条件中的任一条,则确定当前字符串不是方法中的字符串。
步骤409,将包括当前字符串在内的至少一条字符串作为方法进行解析,将解析结果写入缓冲区,将第一偏移量清零,并返回步骤202。
步骤410,将包括当前字符串在内的至少一条字符串作为变量进行解析,将解析结果写入缓冲区,将第一偏移量清零,并返回步骤202。
步骤411,判断当前字符串是否包含右括号,如果包含,则执行步骤413;否则,执行步骤412。
步骤412,将包括当前字符串在内的至少一条字符串作为无用对象进行解析,将第一偏移量清零,并返回步骤202。
其中,无用对象可以为私有类、私有接口、私有方法和私有变量中的一种。
步骤413,判断第一偏移量的取值是否为零,如果为零,则执行步骤415;否则,执行步骤414。
步骤414,根据第一偏移量的取值,删除最近一次写入缓冲区的注释信息,将第二偏移量的取值赋值为第一偏移量的取值。
需要说明的是,执行完本步骤后,继续执行步骤415。
步骤415,将右括号作为解析结果保存到写入缓冲区,将第二偏移量的取值自加该右括号的长度,将第一偏移量清零,并返回步骤202。
上述实施例的步骤405中的“将包括当前字符串在内的至少一条字符串作为类中的字符串进行解析,将解析结果写入缓冲区”,可细化为如图5所示的流程图,包括以下步骤:
步骤501,以空格作为分隔符,将当前字符串分隔成多个字符串,提取与字符串“class”相邻且位于字符串“class”之后的字符串。
步骤502,判断提取到的字符串是否包含左括号,如果包含,则执行步骤503;否则,执行步骤504。
步骤503,将提取到的字符串中位于左括号之前的内容存储为类名,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤504,将提取到的字符串存储为类名。
步骤505,判断当前字符串中是否包含左括号,如果包含,则执行步骤506;否则,执行步骤507。
步骤506,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤507,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度;从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤508,判断当前字符串中是否包含注释信息,如果包含,则执行步骤509;否则,返回步骤505。
步骤509,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤505。
上述实施例的步骤407中的“将包括当前字符串在内的至少一条字符串作为接口中的字符串进行解析,将解析结果写入缓冲区”,可细化为如图6所示的流程图,包括以下步骤:
步骤601,判断当前字符串是否包含左括号,如果包含,则执行步骤606;否则,执行步骤602。
步骤602,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤603,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤604,判断当前字符串中是否包含注释信息,如果包含,则执行步骤605;否则,返回步骤601。
具体地,可以判断当前字符串中是否包含第一预设字符串,如果包含,则确定当前字符串包含注释信息;否则,确定当前字符串不包含注释信息。
步骤605,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤601。
其中,注释信息为第一预设字符串以及当前字符串中位于第一预设字符串之后的字符串。
步骤606,判断当前字符串中的左括号的数量与右括号的数量是否相同,如果相同,则执行步骤607;否则,执行步骤608。
步骤607,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤608,将当前字符串中的左括号以及位于左括号之前的字符串作为解析结果写入缓冲区,获取当前字符串中的左括号以及位于左括号之前的字符串的长度之和,将第二偏移量的取值自加该长度之和。
步骤609,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤610,将包括当前字符串在内的至少一条字符串作为接口体中的字符串进行解析,并在解析结果不为零时,将解析结果写入缓冲区。
上述实施例中的步骤610可细化为如图7-1和7-2所示的流程图,包括以下步骤:
步骤701,判断当前字符串是否为注释字符串,如果是,则执行步骤702;否则,执行步骤706。
步骤702,将包括当前字符串在内的至少一条字符串作为注释字符串进行解析,将解析结果写入缓冲区。
具体地,本步骤的操作过程可细化为步骤301至步骤312。
步骤703,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤704,判断当前字符串中是否包含注释信息,如果包含,则执行步骤705;否则,执行步骤706。
步骤705,将当前字符串更新为当前字符串中除注释信息之外的其他内容。
步骤706,将第一偏移量清零。
步骤707,判断当前字符串是否为空行,如果是,则执行步骤708;否则,执行步骤712。
步骤708,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤709,从当前位置向后读取一行字符串。
步骤710,判断是否读取成功,如果成功,则执行步骤711;否则,结束流程。
步骤711,将读取到的一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置,返回步骤701。
步骤712,判断当前字符串是否为方法中的字符串,如果是,则执行步骤713;否则,执行步骤721。
步骤713,判断当前字符串是否包含“public ”(“public”加空格),如果包含,则执行步骤715;否则,执行步骤714。
步骤714,将“public ”(“public”加空格)写入缓冲区,将第二偏移量的取值自加“public ”的长度。
需要说明的是,执行完本步骤后,继续执行步骤715。
步骤715,判断当前字符串是否包含“;”,如果包含,则执行步骤716;否则,执行步骤717。
步骤716,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度,并返回步骤709。
步骤717,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤718,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤719,判断当前字符串中是否包含注释信息,如果包含,则执行步骤720;否则,返回步骤715。
步骤720,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤715。
步骤721,判断当前字符串是否包含右括号,如果包含,则执行步骤722;否则,执行步骤725。
步骤722,判断第一偏移量是否为零,如果不为零,则执行步骤723;如果为零,则执行步骤724。
步骤723,根据第一偏移量的取值,删除最近一次写入缓冲区的注释信息,将第二偏移量的取值赋值为第一偏移量的取值。
需要说明的是,执行完本步骤后,继续执行步骤724。
步骤724,将右括号作为解析结果写入缓冲区,将第二偏移量的取值自加右括号的长度,并返回步骤709。
步骤725,判断当前字符串是否包含“private ” (“private”加空格),如果包含,则返回步骤709;否则,执行步骤726。
步骤726,判断当前字符串是否包含位于首尾的空格,如果包含,则执行步骤727;否则,执行步骤728。
步骤727,将位于当前字符串的首尾的空格删除。
需要说明的是,执行完本步骤后,继续执行步骤728。
步骤728,判断当前字符串是否包含回车符,如果包含,则执行步骤729;否则,执行步骤730。
步骤729,将回车符从当前字符串中删除。
需要说明的是,执行完本步骤后,继续执行步骤730。
步骤730,判断当前字符串是否为空,如果为空,则返回步骤709;否则,执行步骤731。
步骤731,判断当前字符串是否包含“public ”(“public”加空格),如果包含,则执行步骤733;否则,执行步骤732。
步骤732,将“public ”(“public”加空格)写入缓冲区,将第二偏移量的取值自加“public ”的长度。
需要说明的是,执行完本步骤后,继续执行步骤733。
步骤733,判断当前字符串是否包含“static ”(“static”加空格),如果包含,则执行步骤735;否则,执行步骤734。
步骤734,将“static ”(“static”加空格)写入缓冲区,将第二偏移量的取值自加“static ”的长度。
需要说明的是,执行完本步骤后,继续执行步骤735。
步骤735,判断当前字符串是否包含“final ”(“final”加空格),如果包含,则执行步骤737;否则,执行步骤736。
步骤736,将“final ”(“final”加空格)写入缓冲区,将第二偏移量的取值自加“final ”的长度。
需要说明的是,执行完本步骤后,继续执行步骤737。
步骤737,判断当前字符串是否包含“;”,如果包含,则执行步骤742;否则,执行步骤738。
步骤738,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤739,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤740,判断当前字符串中是否包含注释信息,如果包含,则执行步骤741;否则,返回步骤737。
步骤741,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤737。
步骤742,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度,并返回步骤709。
上述实施例的步骤409中的“将包括当前字符串在内的至少一条字符串作为方法进行解析,将解析结果写入缓冲区”,可细化为如图8所示的流程图,包括以下步骤:
步骤801,判断当前字符串是否包含“public ”(“pubilc”加空格), 如果包含,则执行步骤802;否则,执行步骤803。
步骤802,提取当前字符串中位于“pubilc”(“pubilc”加空格)和“(”之间的字符串。
需要说明的是,执行完步骤802之后,继续执行步骤804。
步骤803,提取当前字符串中位于“protected ”(“protected”加空格)和“(”之间的字符串。
步骤804,根据提取得到的字符串包含的空格,将该字符串拆分成多个字符串,得到包含上述多个字符串的字符串数组。
步骤805,从字符串数组中读取一个未处理过的字符串。
步骤806,判断读取到的字符串是否为“abstract ”(“abstract”加空格)、 “native ”(“native”加空格)、“static ”(“static”加空格)或者“final ”(“final”加空格),如果是,则返回步骤805;否则,执行步骤807。
步骤807,判断读取到的字符串是否与存储的类名相同,如果相同,则执行步骤808,否则;执行步骤810。
步骤808,判断读取到的字符串是否为字符串数组的最后一个元素,是则执行步骤809,否则执行步骤810。
步骤809,确定当前字符串对应的函数返回类型为构造函数,将函数返回类型变量的取值设置为第一预设值。
需要说明的是,执行完步骤809之后,继续执行步骤817。
其中,函数返回类型变量(retType)用于标识当前字符串对应的函数返回类型。
步骤810,判断读取到的字符串是否为“void ”(“void”加空格),如果是,则执行步骤811;否则,执行步骤812。
步骤811,确定当前字符串对应的函数返回类型为void类型,将函数返回类型变量的取值设置为第二预设值。
需要说明的是,执行完步骤811之后,继续执行步骤817。
步骤812,判断读取到的字符串是否为“boolean ”(“boolean”加空格),如果是,则执行步骤813;否则,执行步骤814。
步骤813,确定当前字符串对应的函数返回类型为boolean类型,将函数返回类型变量的取值设置为第三预设值。
需要说明的是,执行完步骤813之后,继续执行步骤817。
步骤814,判断读取到的字符串是否为“byte ”(“byte”加空格)、“short ”(“short”加空格)或者“int ”(“int”加空格),如果是,则执行步骤815;否则,执行步骤816。
步骤815,确定当前字符串对应的函数返回类型为基本类型,将函数返回类型变量的取值设置为第四预设值。
需要说明的是,执行完步骤815之后,继续执行步骤817。
步骤816,确定当前字符串对应的函数返回类型为特殊类型,将函数返回类型变量的取值设置为第五预设值。
其中,特殊类型可以为string类型,也可以为char类型,还可以为类类型。
步骤817,判断当前字符串是否包含“abstract ”(“abstract”加空格)或 “native ”(“native”加空格),如果包含,则执行步骤818;否则,执行步骤819。
步骤818,将包括当前字符串在内的至少一条字符串作为特殊方法进行解析,将解析结果写入缓冲区。
步骤819,将包括当前字符串在内的至少一条字符串作为普通方法进行解析,将解析结果写入缓冲区。
上述实施例中的步骤819可细化为如图9-1和图9-2所示的流程图,包括以下步骤:
步骤901,将第一变量的取值设置为零。
其中,第一变量用于标识无用左括号的数量。
步骤902,判断当前字符串是否包含左括号,如果包含,则执行步骤907;否则,执行步骤903。
步骤903,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤904,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤905,判断当前字符串中是否包含注释信息,如果包含,则执行步骤906;否则,返回步骤902。
步骤906,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤902。
步骤907,将当前字符串中的左括号以及当前字符串中位于该左括号之前的字符串作为解析结果写入缓冲区,获取该左括号和当前字符串中位于该左括号之前的字符串的长度之和,将第二偏移量的取值自加该长度之和。
步骤908,判断当前字符串中的左括号的数量是否与右括号的数量相同,如果相同,则执行步骤925;否则,执行步骤909。
步骤909,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤910,判断当前字符串中是否包含注释信息,如果包含,则执行步骤911;否则,执行步骤912。
步骤911,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并执行步骤912。
步骤912,判断当前字符串是否包含第六预设字符串,如果包含,则执行步骤913;否则,执行步骤919。
其中,第六预设字符串可以为“super(”,也可以为“super”、空格和“(”的顺序组合,即“super (”;还可以为“this(”,还可以为“this”、空格和“(”的顺序组合,即“this (”。
步骤913,判断当前字符串是否包含“;”,如果包含,则执行步骤918;否则,执行步骤914。
步骤914,将当前字符串中的第六预设字符串以及当前字符串中位于第六预设字符串之后的字符串作为解析结果写入缓冲区,获取第六预设字符串以及当前字符串中位于第六预设字符串之后的字符串的长度之和,将第二偏移量的取值自加该长度之和。
步骤915,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤916,判断当前字符串中是否包含注释信息,如果包含,则执行步骤917;否则,返回步骤913。
步骤917,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤913。
步骤918,将当前字符串中的第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串作为解析结果写入缓冲区,获取第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串的长度之和,将第二偏移量的取值自加该长度之和。
需要说明的是,执行完本步骤后,继续执行步骤919。
步骤919,判断当前字符串中的左括号的数量是否大于右括号的数量,如果是,则执行步骤920;否则,执行步骤921。
步骤920,获取当前字符串中的左括号的数量减去右括号的数量得到的差值,将第一变量的取值自加该差值,并返回909。
步骤921,判断当前字符串中的右括号的数量是否大于左括号的数量,如果是,则执行步骤922;否则,执行步骤909。
步骤922,判断第一变量的取值是否大于零,如果大于,则执行步骤923;否则,执行步骤924。
步骤923,获取当前字符串中的右括号的数量减去左括号的数量得到的差值,将第一变量的取值自减该差值,并返回909。
步骤924,判断第一变量的取值是否为零,如果为零,则执行步骤925;否则,返回步骤909。
步骤925,判断函数返回类型变量的取值是否为第一预设值,如果是,则执行步骤926;否则,执行步骤927。
步骤926,将“}”作为解析结果写入缓冲区。
步骤927,判断函数返回类型变量的取值是否为第二预设值,如果是,则执行步骤928;否则,执行步骤929。
步骤928,将“}”作为解析结果写入缓冲区。
步骤929,判断函数返回类型变量的取值是否为第三预设值,如果是,则执行步骤930;否则,执行步骤931。
步骤930,将“return false;”作为解析结果写入缓冲区。
步骤931,判断函数返回类型变量的取值是否为第四预设值,如果是,则执行步骤932;否则,执行步骤933。
步骤932,将“return 0;”作为解析结果写入缓冲区。
步骤933,将“return null;”作为解析结果写入缓冲区。
上述实施例中的步骤818可细化为如图10所示的流程图,包括以下步骤:
步骤1001,判断当前字符串是否包含“;”,如果包含,则执行步骤1006;否则,执行步骤1002。
步骤1002,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤1003,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤1004,判断当前字符串中是否包含注释信息,如果包含,则执行步骤1005;否则,返回步骤1001。
步骤1005,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤1001。
步骤1006,将当前字符串中的“;”及“;”之前的字符串作为解析结果写入缓冲区,获取当前字符串中的“;”及“;”之前的字符串的长度之和,将第二偏移量的取值自加该长度之和。
上述实施例中的步骤410中的“将包括当前字符串在内的至少一条字符串作为变量进行解析,将解析结果写入缓冲区”,可细化为如图11所示的流程图,包括以下步骤:
步骤1101,判断当前字符串是否包含“;”,如果包含,则执行步骤1106;否则,执行步骤1102。
步骤1102,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤1103,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤1104,判断当前字符串中是否包含注释信息,如果包含,则执行步骤1105;否则,返回步骤1101。
步骤1105,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤1101。
步骤1106,将当前字符串中的“;”及“;”之前的字符串作为解析结果写入缓冲区,获取当前字符串中的“;”及“;”之前的字符串的长度之和,将第二偏移量的取值自加该长度之和。
上述实施例中的步骤412中的“将包括当前字符串在内的至少一条字符串作为无用对象进行解析”,可细化为如图12所示的流程图,包括以下步骤:
步骤1201,判断第一偏移量的取值是否为零,如果为零,则执行步骤1202;否则,执行步骤1203。
步骤1202,根据第一偏移量的取值,删除最近一次写入缓冲区的注释信息,将第二偏移量的取值赋值为第一偏移量的取值。
需要说明的是,执行完本步骤后,继续执行步骤1203。
步骤1203,判断当前字符串是否包含“class ”(“class”加空格),如果包含,则执行步骤1211;否则,执行步骤1204。
步骤1204,判断当前字符串是否包含“interface ”(“interface”加空格),如果包含,则执行步骤1211;否则,执行步骤1205;
步骤1205,判断当前字符串是否为方法中的字符串,如果是,则执行步骤1211;否则,执行步骤1206。
步骤1206,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤1207,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤1208,判断当前字符串中是否包含注释信息,如果包含,则执行步骤1209;否则,执行步骤1210。
步骤1209,将当前字符串更新为当前字符串中除注释信息之外的其他内容。
需要说明的是,执行完本步骤,继续执行步骤1210。
步骤1210,判断当前字符串是否包含“;”,如果包含,则结束流程;否则,返回步骤1207。
步骤1211,将第二变量的取值设置为零。
其中,第二变量用于标识私有类、私有接口和私有方法中的左括号的数量和右括号的数量之间的差值。
步骤1212,判断当前字符串中的左括号的数量是否等于右括号的数量,如果是,则结束流程;否则,执行步骤1213。
步骤1213,判断当前字符串中的左括号的数量是否大于右括号的数量,如果是,则执行步骤1214;否则,执行步骤1215。
步骤1214,获取当前字符串中的左括号的数量减去右括号的数量得到的差值,将第二变量的取值自加该差值。
需要说明的是,执行完本步骤后,继续执行步骤1215。
步骤1215,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤1216,判断当前字符串中是否包含注释信息,如果包含,则执行步骤1217;否则,执行步骤1218。
步骤1217,将当前字符串更新为当前字符串中除注释信息之外的其他内容。
需要说明的是,执行完本步骤后,继续执行步骤1218。
步骤1218,判断当前字符串中的左括号的数量是否大于右括号的数量,如果是,则执行步骤1219;否则,执行步骤1220。
步骤1219,获取当前字符串中的左括号的数量减去右括号的数量得到的差值,将第二变量的取值自加该差值,并返回步骤1215。
步骤1220,判断当前字符串中的右括号的数量是否大于左括号的数量,如果是,则执行步骤1221;否则,返回步骤1215。
步骤1221,判断第二变量的取值是否为零,如果不为零,则返回步骤1215;如果为零,则结束流程。
上述实施例中的步骤402中的“将包括当前字符串在内的至少一条字符串作为包含特殊字段的字符串进行解析,将解析结果写入缓冲区”,可细化为如图13所示的流程图,包括以下步骤:
步骤1301,判断当前字符串是否包含“;”,如果包含,则执行步骤1306;否则,执行步骤1302。
步骤1302,将当前字符串作为解析结果写入缓冲区,将第二偏移量的取值自加当前字符串的长度。
步骤1303,从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置。
步骤1304,判断当前字符串中是否包含注释信息,如果包含,则执行步骤1305;否则,返回步骤1301。
步骤1305,将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤1301。
步骤1306,将当前字符串中的“;”及“;”之前的字符串作为解析结果写入缓冲区,获取当前字符串中的“;”及“;”之前的字符串的长度之和,将第二偏移量的取值自加该长度之和。
本发明实施例通过解析源文件,将纯注释字符串和对源文件中的其他字符串的解析结果写入目标文件,以便于将现有的伺服类库模式转换成简洁模式,从而避免将源代码直接显示给用户,提高了源文件的安全性和可读性。
实施例2
如图14所示,为本实施例中的一种解析源文件的装置结构图,包括初始化模块1401、读取模块1402、第一判断模块1403、第一更新模块1404、第二判断模块1405、第一解析模块1406、第二解析模块1407、第二更新模块1408、第三解析模块1409、第四解析模块1410和写入模块1411,其中,
初始化模块1401,用于打开源文件,将所述源文件的起始位置作为当前位置,并触发读取模块1402。
读取模块1402,用于从当前位置向后读取一行字符串。
第一判断模块1403,用于判断读取模块1402是否读取成功。
第一更新模块1404,用于在第一判断模块1403判断读取成功时,将读取到的一行字符串作为当前字符串,并将所述当前位置更新为位于所述当前字符串之后且与所述当前字符串相邻的位置,并触发第二判断模块1405。
第二判断模块1405,用于对所述当前字符串进行判断。
第一解析模块1406,用于在第二判断模块1405判断所述当前字符串为注释字符串时,将包括所述当前字符串在内的至少一条字符串作为注释字符串进行解析,将解析结果写入缓冲区,并触发读取模块1402。
其中,所述当前字符串为注释字符串,具体为:所述当前字符串包含第一预设字符串,且所述当前字符串不包含位于所述第一预设字符串之前的字符串,所述第一预设字符串为“/*”、“/* ”、“//”和“// ”中的任一种。
第二解析模块1407,用于在第二判断模块1405判断所述当前字符串为空行时,将所述当前字符串写入缓冲区,并触发读取模块1402。
第二更新模块1408,用于在第二判断模块1405判断所述当前字符串不是注释字符串或者空行,但包含注释信息时,用于将当前字符串更新为所述当前字符串中除注释信息之外的其他内容,并触发第三解析模块1409。
其中,所述当前字符串包含注释信息,具体为:所述当前字符串中包含第一预设字符串,所述第一预设字符串为“/*”、“/* ”、“//”和“// ”中的任一种。
第三解析模块1409,用于将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并触发读取模块1402。
第四解析模块1410,用于在第二判断模块1405判断所述当前字符串不是注释字符串或者空行,也不包含注释信息时,将包括当前字符串在内的至少一条字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并触发读取模块1402。
写入模块1411,用于在第一判断模块1403判断读取失败时,将缓冲区中的内容写入目标文件。
如图15所示,为本实施例中上述第一解析模块1406的结构示意图,包括清零子模块1501、第一判断子模块1502、第一解析子模块1503、更新子模块1504、第二判断子模块1505、删除子模块1506、第三判断子模块1507、第二解析子模块1508、第三解析子模块1509和第四解析子模块1510,其中,
清零子模块1501,用于在第二判断模块1405判断所述当前字符串为注释字符串时,将第一偏移量清零,并触发第一判断子模块1502,所述第一偏移量用于标识当最近一次写入缓冲区的内容为注释信息时,该注释信息在所述缓冲区中的起始位置相对于缓冲区的首地址的偏移量。
第一判断子模块1502,用于对所述当前字符串进行判断,如果所述当前字符串包含第二预设字符串但不包含第三预设字符串,则触发第一解析子模块1503;如果所述当前字符串包含第二预设字符串和第三预设字符串,则触发第三判断子模块1507;如果所述当前字符串不包含第二预设字符串,则触发第四解析子模块1510。
其中,第二预设字符串为“/*”或“/* ”,第三预设字符串为“*/”或“ */”。
第一解析子模块1503,用于将所述第一偏移量的取值赋值为第二偏移量的取值,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,并触发更新子模块1504,所述第二偏移量用于标识最近一次写入缓冲区的解析结果在所述缓冲区中的结束位置相对于所述缓冲区的首地址的偏移量。
更新子模块1504,用于从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置,并触发第二判断子模块1505。
第二判断子模块1505,用于判断所述当前字符串是否包含位于首尾的空格,如果包含,则触发删除子模块1506;否则,触发第一解析子模块1503。
删除子模块1506,用于将位于所述当前字符串的首尾的空格删除,并触发第一解析子模块1503。
第三判断子模块1507,用于判断所述当前字符串中是否存在位于第三预设字符串之后的字符串,如果存在,则触发第二解析子模块1508;否则,触发第四解析子模块1510。
第二解析子模块1508,用于将所述第一偏移量的取值赋值为所述第二偏移量的取值,将所述当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和,将当前字符串更新为当前字符串中位于第三预设字符串之后的字符串,并触发第三解析子模块1509。
第三解析子模块1509,用于将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入所述缓冲区,并触发读取模块1402。
第四解析子模块1510,用于将所述第一偏移量的取值赋值为所述第二偏移量的取值,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,并触发读取模块1402。
如图16所示,为本实施例中上述第三解析模块、第四解析模块和第三解析子模块的结构示意图,包括第一判断单元1601、第一解析单元1602、第二判断单元1603、第二解析单元1604、第三解析单元1605、第四解析单元1606、第五解析单元1607、第三判断单元1608、第六解析单元1609、第七解析单元1610和第八解析单元1611,其中,
第一判断单元1601,用于对所述当前字符串进行判断,如果所述当前字符串包含第四预设字符串,则触发第一解析单元1602;如果所述当前字符串包含第五预设字符串,则触发第二判断单元1603;如果所述当前字符串包括右括号,则触发第三判断单元1608;如果所述当前字符串不包含第四预设字符串、第五预设字符串或者右括号,则触发第八解析单元1611。
其中,第四预设字符串为“package ”或“import ”,第五预设字符串为“public ”或“protected ”。
第一解析单元1602,用于将包括所述当前字符串在内的至少一条字符串作为包含特殊字段的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
第二判断单元1603,用于对所述当前字符串进行判断,如果所述当前字符串包含“class ”,则触发第二解析单元1604;如果所述当前字符串包含“interface ”,则触发第三解析单元1605;如果所述当前字符串为方法中的字符串,则触发第四解析单元1606;如果所述当前字符串不包含“class ”或“interface ”,也不是方法中的字符串,则触发第五解析单元1607。
第二解析单元1604,用于将包括所述当前字符串在内的至少一条字符串作为类中的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
具体地,第二解析单元1604,具体用于执行以下操作:
D1、以空格作为分隔符,将所述当前字符串分隔成多个字符串,提取与字符串“class”相邻且位于字符串“class”之后的字符串;
D2、判断提取到的字符串是否包含左括号,如果包含,则执行步骤D3;否则,执行步骤D4;
D3、将提取到的字符串中位于左括号之前的内容存储为类名,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,将所述第一偏移量清零,并触发读取模块1402;
D4、将提取到的字符串存储为类名;
D5、判断所述当前字符串中是否包含左括号,如果包含,则执行步骤D6;否则,执行步骤D7;
D6、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,将所述第一偏移量清零,并触发读取模块1402;
D7、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
D8、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤D9;否则,返回步骤D5;
D9、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤D5。
第三解析单元1605,用于将包括所述当前字符串在内的至少一条字符串作为接口中的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
具体地,第三解析单元1605,具体用于执行以下操作:
E1、对所述当前字符串进行判断,如果所述当前字符串不包含左括号,则执行步骤E2;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量相同,则执行步骤E6;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量不相同,则执行步骤E7;
E2、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加当前字符串的长度;
E3、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
E4、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤E5;否则,返回步骤E1;
E5、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤E1;
E6、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,将所述第一偏移量清零,并触发读取模块1402;
E7、将所述当前字符串中的左括号以及位于左括号之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的左括号以及位于左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
E8、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
E9、将包括所述当前字符串在内的至少一条字符串作为接口体中的字符串进行解析,并在解析结果不为零时,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
第四解析单元1606,用于将包括所述当前字符串在内的至少一条字符串作为方法进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
第五解析单元1607,用于将包括所述当前字符串在内的至少一条字符串作为变量进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
第三判断单元1608,用于判断所述第一偏移量的取值是否为零,如果为零,则触发第六解析单元1609;否则,触发第七解析单元1610。
第六解析单元1609,用于将右括号作为解析结果保存到写入所述缓冲区,将所述第二偏移量的取值自加该右括号的长度,将所述第一偏移量清零,并触发读取模块1402。
第七解析单元1610,用于根据所述第一偏移量的取值,删除最近一次写入所述缓冲区的注释信息,将所述第二偏移量的取值赋值为所述第一偏移量的取值;将右括号作为解析结果保存到写入所述缓冲区,将所述第二偏移量的取值自加该右括号的长度,将所述第一偏移量清零,并触发读取模块1402。
第八解析单元1611,用于将包括所述当前字符串在内的至少一条字符串作为无用对象进行解析,将所述第一偏移量清零,并触发读取模块1402。
具体地,第八解析单元1611,具体用于执行以下操作:
I1、判断所述第一偏移量的取值是否为零,如果为零,则执行步骤I2;否则,执行步骤I3;
I2、根据所述第一偏移量的取值,删除最近一次写入所述缓冲区的注释信息,将所述第二偏移量的取值赋值为所述第一偏移量的取值,并执行步骤I3;
I3、对所述当前字符串进行判断,如果所述当前字符串包含“class”或“interface ”,或者为方法中的字符串,则执行步骤I9;如果所述当前字符串既不包含“class ”或“interface ”,也不是方法中的字符串,则执行步骤I4;
I4、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度。
I5、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
I6、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤I7;否则,执行步骤I8;
I7、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并执行步骤I8;
I8、判断所述当前字符串是否包含“;”,如果包含,则将所述第一偏移量清零,并触发所述读取模块;否则,返回步骤I5;
I9、将第二变量的取值设置为零;
I10、对所述当前字符串进行判断,如果所述当前字符串中的左括号的数量等于右括号的数量,则将所述第一偏移量清零,并触发所述读取模块;如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤I11;如果所述当前字符串中的左括号的数量小于右括号的数量,则执行步骤I12;
I11、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将第二变量的取值自加该差值,并执行步骤I12;
I12、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
I13、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤I14;否则,执行步骤I15;
I14、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并执行步骤I15;
I15、对所述当前字符串进行判断,如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤I16;如果所述当前字符串中的左括号的数量小于右括号的数量,则执行步骤I17;如果所述当前字符串中的左括号的数量等于右括号的数量,则执行步骤I12;
I16、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将所述第二变量的取值自加该差值,并返回步骤I12;
I17、判断所述第二变量的取值是否为零,如果不为零,则返回步骤I12;如果为零,则将所述第一偏移量清零,并触发读取模块1402。
如图17所示,为本实施例中上述第四解析单元的结构示意图,包括:
第一判断子单元1701,用于对所述当前字符串进行判断,如果所述当前字符串包含“abstract ”或 “native ”,则触发第一解析子单元1707;如果所述当前字符串不包含“abstract ”或 “native”,则触发第二解析子单元1708。
提取子单元1702,用于在第一判断子单元1701判断所述当前字符串中包含“public ”时,提取所述当前字符串中位于“public ”和“(”之间的字符串;在第一判断子单元1701判断所述当前字符串中包含“protected ”时,提取所述当前字符串中位于“protected ”和“(”之间的字符串。
拆分子单元1703,用于根据提取子单元1702提取到的字符串包含的空格,将所述提取到的字符串拆分成多个字符串,得到包含上述多个字符串的字符串数组。
读取子单元1704,用于从拆分子单元1703拆分得到的所述字符串数组中读取一个未处理过的字符串。
第二判断子单元1705,用于对读取子单元1704读取到的字符串进行判断,如果所述读取到的字符串为“abstract ”、 “native ”、“static ”或者“final ”,则触发读取子单元1704。
设置子单元1706,用于在第二判断子单元1705判断所述读取到的字符串为“void ”时,确定所述当前字符串对应的函数返回类型为void类型,将函数返回类型变量的取值设置为第二预设值;
在第二判断子单元1705判断所述读取到的字符串为“boolean ”时,确定所述当前字符串对应的函数返回类型为boolean类型,将函数返回类型变量的取值设置为第三预设值;
在第二判断子单元1705判断所述读取到的字符串为“byte ”、“short ”或者“int ”时,确定所述当前字符串对应的函数返回类型为基本类型,将函数返回类型变量的取值设置为第四预设值;
在第二判断子单元1705判断所述读取到的字符串不是“abstract ”、 “native ”、“static ”、“final ” 、“void ”、“boolean ”、“byte ”、“short ”或者“int ”、且所述读取到的字符串与存储的类名不同或者所述读取到的字符串不是所述字符串数组的最后一个元素时,确定所述当前字符串对应的函数返回类型为特殊类型,将函数返回类型变量的取值设置为第五预设值;
在第二判断子单元1705判断所述读取到的字符串不是“abstract ”、 “native ”、“static ”、“final ” 、“void ”、“boolean ”、“byte ”、“short ”或者“int ”、所述读取到的字符串与存储的类名相同,且所述读取到的字符串是所述字符串数组的最后一个元素时,确定所述当前字符串对应的函数返回类型为构造函数,将函数返回类型变量的取值设置为第一预设值。
第一解析子单元1707,用于将包括所述当前字符串在内的至少一条字符串作为特殊方法进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
具体地,第一解析子单元1707,具体用于执行以下操作:
G1、判断所述当前字符串是否包含“;”,如果包含,则执行步骤G5;否则,执行步骤G2;
G2、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
G3、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤G4;否则,并返回步骤G1;
G4、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤G1;
G5、将所述当前字符串中的“;”及“;”之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的“;”及“;”之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和,将所述第一偏移量清零,并触发读取模块1402。
第二解析子单元1708,用于将包括所述当前字符串在内的至少一条字符串作为普通方法进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
具体地,第二解析子单元1708,具体用于执行以下操作:
H1、将第一变量的取值设置为零;
H2、对所述当前字符串进行判断,如果所述当前字符串不包含左括号,则执行步骤H3;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量不相同,则执行步骤H7;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量相同,则执行步骤H22;
H3、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
H4、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H5、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤H6;否则,返回步骤H2;
H6、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H2;
H7、将所述当前字符串中的左括号以及所述当前字符串中位于该左括号之前的字符串作为解析结果写入所述缓冲区,获取该左括号和当前字符串中位于该左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H8、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H9、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤H6;否则,返回步骤H11;
H10、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H11;
H11、对所述当前字符串进行判断,如果所述当前字符串包含第六预设字符串,则执行步骤H12;如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤H18;如果所述当前字符串中的右括号的数量大于左括号的数量,则执行步骤H19;如果所述当前字符串不包含第六预设字符串,且所述当前字符串中的右括号的数量等于左括号的数量,则执行步骤H8;
其中,第六预设字符串为“super(”、“super (”、“this(”和“this (”中的任一种。
H12、判断所述当前字符串是否包含“;”,如果包含,则执行步骤H17;否则,执行步骤H13;
H13、将所述当前字符串中的第六预设字符串以及当前字符串中位于第六预设字符串之后的字符串作为解析结果写入所述缓冲区,获取第六预设字符串以及所述当前字符串中位于第六预设字符串之后的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H14、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H15、判断当前字符串中是否包含注释信息,如果包含,则执行步骤H16;否则,返回步骤H12;
H16、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H12;
H17、将所述当前字符串中的第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串作为解析结果写入所述缓冲区,获取第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串的长度之和,将所述第二偏移量的取值自加该长度之和,并返回步骤H8;
H18、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将所述第一变量的取值自加该差值,并返回步骤H8;
H19、判断所述第一变量的取值是否大于零,如果大于,则执行步骤H20;否则,执行步骤H21;
H20、获取所述当前字符串中的右括号的数量减去左括号的数量得到的差值,将所述第一变量的取值自减该差值,并返回步骤H8;
H21、判断所述第一变量的取值是否为零,如果为零,则执行步骤H23;否则,返回步骤H8;
H22、将所述当前字符串中的左括号以及所述当前字符串中位于该左括号之前的字符串作为解析结果写入所述缓冲区,获取该左括号和当前字符串中位于该左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H23、对函数返回类型变量的取值进行判断,如果所述函数返回类型变量的取值为第一预设值,则执行步骤H24;如果所述函数返回类型变量的取值为第二预设值,则执行步骤H25;如果所述函数返回类型变量的取值为第三预设值,则执行步骤H26;如果所述函数返回类型变量的取值为第四预设值,则执行步骤H27;如果所述函数返回类型变量的取值为第五预设值,则执行步骤H28;
H24、将“}”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402;
H25、将“}”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402;
H26、将“return false;”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402;
H27、将“return 0;”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402;
H28、将“return null;”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发读取模块1402。
本发明实施例通过解析源文件,将解析结果写入目标文件,将现有的伺服类库模式转换成简洁模式,从而避免将源代码直接显示给用户,提高了源文件的安全性和可读性。
结合本文中所公开的实施例描述的方法中的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
Claims (24)
1.一种解析源文件的方法,其特征在于,包括以下步骤:
A1、打开源文件,将所述源文件的起始位置作为当前位置;
A2、从当前位置向后读取一行字符串;
A3、判断是否读取成功,如果成功,则执行步骤A4;否则,执行步骤A11;
A4、将读取到的一行字符串作为当前字符串,并将所述当前位置更新为位于所述当前字符串之后且与所述当前字符串相邻的位置;
A5、对所述当前字符串进行判断,如果所述当前字符串为注释字符串,则执行步骤A6;如果所述当前字符串为空行,则执行步骤A7;如果所述当前字符串不是注释字符串或者空行,但包含注释信息,则执行步骤A8;如果所述当前字符串不是注释字符串或者空行,也不包含注释信息,则执行步骤A10;
A6、将包括所述当前字符串在内的至少一条字符串作为注释字符串进行解析,将解析结果写入缓冲区,并返回步骤A2;
A7、将所述当前字符串写入缓冲区,并返回步骤A2;
A8、将当前字符串更新为所述当前字符串中除注释信息之外的其他内容;
A9、将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并返回步骤A2;
A10、将包括当前字符串在内的至少一条字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并返回步骤A2;
A11、将缓冲区中的内容写入目标文件。
2.如权利要求1所述的方法,其特征在于,所述当前字符串为注释字符串,具体为:
所述当前字符串包含第一预设字符串,且所述当前字符串不包含位于所述第一预设字符串之前的字符串,所述第一预设字符串为“/*”、“/* ”、“//”和“// ”中的任一种。
3.如权利要求1所述的方法,其特征在于,所述当前字符串包含注释信息,具体为:
所述当前字符串中包含第一预设字符串,所述第一预设字符串为“/*”、“/* ”、“//”和“// ”中的任一种。
4.如权利要求1所述的方法,其特征在于,步骤A6,具体包括:
B1、将第一偏移量清零,所述第一偏移量用于标识当最近一次写入缓冲区的内容为注释信息时,该注释信息在所述缓冲区中的起始位置相对于缓冲区的首地址的偏移量;
B2、对所述当前字符串进行判断,如果所述当前字符串包含第二预设字符串但不包含第三预设字符串,则执行步骤B3;如果所述当前字符串包含第二预设字符串和第三预设字符串,则执行步骤B7;如果所述当前字符串不包含第二预设字符串,则执行步骤B11;
B3、将所述第一偏移量的取值赋值为第二偏移量的取值,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,所述第二偏移量用于标识最近一次写入缓冲区的解析结果在所述缓冲区中的结束位置相对于所述缓冲区的首地址的偏移量;
B4、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
B5、判断所述当前字符串是否包含位于首尾的空格,如果包含,则执行步骤B6;否则,返回步骤B3;
B6、将位于所述当前字符串的首尾的空格删除,并返回步骤B3;
B7、判断所述当前字符串中是否存在位于第三预设字符串之后的字符串,如果存在,则执行步骤B8;否则,执行步骤B11;
B8、将所述第一偏移量的取值赋值为所述第二偏移量的取值,将所述当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串的长度之和, 将所述第二偏移量的取值自加该长度之和;
B9、将当前字符串更新为当前字符串中位于第三预设字符串之后的字符串;
B10、将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入所述缓冲区,并返回步骤A2;
B11、将所述第一偏移量的取值赋值为所述第二偏移量的取值,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,并返回步骤A2;
步骤A9、A10和B10,均具体包括:
C1、对所述当前字符串进行判断,如果所述当前字符串包含第四预设字符串,则执行步骤C2;如果所述当前字符串包含第五预设字符串,则执行步骤C3;如果所述当前字符串包括右括号,则执行步骤C8;如果所述当前字符串不包含第四预设字符串、第五预设字符串或者右括号,则执行步骤C11;
C2、将包括所述当前字符串在内的至少一条字符串作为包含特殊字段的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并返回步骤A2;
C3、对所述当前字符串进行判断,如果所述当前字符串包含“class”,则执行步骤C4;如果所述当前字符串包含“interface”,则执行步骤C5;如果所述当前字符串为方法中的字符串,则执行步骤C6;如果所述当前字符串不包含“class”或“interface”,也不是方法中的字符串,则执行步骤C7;
C4、将包括所述当前字符串在内的至少一条字符串作为类中的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并返回步骤A2;
C5、将包括所述当前字符串在内的至少一条字符串作为接口中的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并返回步骤A2;
C6、将包括所述当前字符串在内的至少一条字符串作为方法进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并返回步骤A2;
C7、将包括所述当前字符串在内的至少一条字符串作为变量进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并返回步骤A2;
C8、判断所述第一偏移量的取值是否为零,如果为零,则执行步骤C9;否则,执行步骤C10;
C9、将右括号作为解析结果保存到写入所述缓冲区,将所述第二偏移量的取值自加该右括号的长度,将所述第一偏移量清零,并返回步骤A2;
C10、根据所述第一偏移量的取值,删除最近一次写入所述缓冲区的注释信息,将所述第二偏移量的取值赋值为所述第一偏移量的取值;将右括号作为解析结果保存到写入所述缓冲区,将所述第二偏移量的取值自加该右括号的长度,将所述第一偏移量清零,并返回步骤A2;
C11、将包括所述当前字符串在内的至少一条字符串作为无用对象进行解析,将所述第一偏移量清零,并返回步骤A2。
5.如权利要求4所述的方法,其特征在于,所述第二预设字符串为“/*”或“/* ”,所述第三预设字符串为“*/”或“*/ ”;所述第四预设字符串为“package”或“import”,所述第五预设字符串为“public”或“protected”。
6.如权利要求4所述的方法,其特征在于,将包括所述当前字符串在内的至少一条字符串作为类中的字符串进行解析,将解析结果写入所述缓冲区,具体包括:
D1、以空格作为分隔符,将所述当前字符串分隔成多个字符串,提取与字符串“class”相邻且位于字符串“class”之后的字符串;
D2、判断提取到的字符串是否包含左括号,如果包含,则执行 步骤D3;否则,执行步骤D4;
D3、将提取到的字符串中位于左括号之前的内容存储为类名,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
D4、将提取到的字符串存储为类名;
D5、判断所述当前字符串中是否包含左括号,如果包含,则执行步骤D6;否则,执行步骤D7;
D6、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
D7、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
D8、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤D9;否则,返回步骤D5;
D9、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤D5。
7.如权利要求4所述的方法,其特征在于,将包括当前字符串在内的至少一条字符串作为接口中的字符串进行解析,将解析结果写入缓冲区,具体包括:
E1、对所述当前字符串进行判断,如果所述当前字符串不包含左括号,则执行步骤E2;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量相同,则执行步骤E6;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量不相同,则执行步骤E7;
E2、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加当前字符串的长度;
E3、从当前位置向后读取一行字符串作为当前字符串,并将当前 位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
E4、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤E5;否则,返回步骤E1;
E5、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤E1;
E6、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
E7、将所述当前字符串中的左括号以及位于左括号之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的左括号以及位于左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
E8、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
E9、将包括所述当前字符串在内的至少一条字符串作为接口体中的字符串进行解析,并在解析结果不为零时,将解析结果写入所述缓冲区。
8.如权利要求4所述的方法,其特征在于,将包括所述当前字符串在内的至少一条字符串作为方法进行解析,将解析结果写入所述缓冲区,具体包括:
F1、对所述当前字符串进行判断,如果所述当前字符串中包含“public”,则执行步骤F2;如果所述当前字符串中包含“protected”,则执行步骤F3;
F2、提取所述当前字符串中位于“public”和“(”之间的字符串,并执行步骤F4;
F3、提取所述当前字符串中位于“protected”和“(”之间的字符串;
F4、根据提取到的字符串包含的空格,将所述提取到的字符串拆分成多个字符串,得到包含上述多个字符串的字符串数组;
F5、从所述字符串数组中读取一个未处理过的字符串;
F6、对所述读取到的字符串进行判断,如果所述读取到的字符串为“abstract”、“native”、“static”或者“final”,则返回F5;如果所述读取到的字符串为“void”,则执行步骤F7;如果所述读取到的字符串为“boolean”,则执行步骤F8;如果所述读取到的字符串为“byte”、“short”或者“int”,则执行步骤F9;如果所述读取到的字符串不是“abstract”、“native”、“static”、“final”、“void”、“boolean”、“byte”、“short”或者“int”、且所述读取到的字符串与存储的类名不同或者所述读取到的字符串不是所述字符串数组的最后一个元素,则执行步骤F10;如果所述读取到的字符串不是“abstract”、“native”、“static”、“final”、“void”、“boolean”、“byte”、“short”或者“int”、所述读取到的字符串与存储的类名相同,且所述读取到的字符串是所述字符串数组的最后一个元素,则执行步骤F11;
F7、确定所述当前字符串对应的函数返回类型为void类型,将函数返回类型变量的取值设置为第二预设值,并执行步骤F12;
F8、确定所述当前字符串对应的函数返回类型为boolean类型,将函数返回类型变量的取值设置为第三预设值,并执行步骤F12;
F9、确定所述当前字符串对应的函数返回类型为基本类型,将函数返回类型变量的取值设置为第四预设值,并执行步骤F12;
F10、确定所述当前字符串对应的函数返回类型为特殊类型,将函数返回类型变量的取值设置为第五预设值,并执行步骤F12;
F11、确定所述当前字符串对应的函数返回类型为构造函数,将函数返回类型变量的取值设置为第一预设值;
F12、如果所述当前字符串包含“abstract”或“native”,则将包括所述当前字符串在内的至少一条字符串作为特殊方法进行解析,将解析结果写入所述缓冲区;如果所述当前字符串不包含“abstract”或“native”,则将包括所述当前字符串在内的至少一条字符串作为 普通方法进行解析,将解析结果写入所述缓冲区。
9.如权利要求8所述的方法,其特征在于,将包括所述当前字符串在内的至少一条字符串作为特殊方法进行解析,将解析结果写入所述缓冲区,具体包括:
G1、判断所述当前字符串是否包含“;”,如果包含,则执行步骤G5;否则,执行步骤G2;
G2、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
G3、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤G4;否则,并返回步骤G1;
G4、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤G1;
G5、将所述当前字符串中的“;”及“;”之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的“;”及“;”之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和。
10.如权利要求8所述的方法,其特征在于,将包括所述当前字符串在内的至少一条字符串作为普通方法进行解析,将解析结果写入所述缓冲区,具体包括:
H1、将第一变量的取值设置为零;
H2、对所述当前字符串进行判断,如果所述当前字符串不包含左括号,则执行步骤H3;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量不相同,则执行步骤H7;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量相同,则执行步骤H22;
H3、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
H4、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H5、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤H6;否则,返回步骤H2;
H6、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H2;
H7、将所述当前字符串中的左括号以及所述当前字符串中位于该左括号之前的字符串作为解析结果写入所述缓冲区,获取该左括号和当前字符串中位于该左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H8、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H9、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤H6;否则,返回步骤H11;
H10、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H11;
H11、对所述当前字符串进行判断,如果所述当前字符串包含第六预设字符串,则执行步骤H12;如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤H18;如果所述当前字符串中的右括号的数量大于左括号的数量,则执行步骤H19;如果所述当前字符串不包含第六预设字符串,且所述当前字符串中的右括号的数量等于左括号的数量,则执行步骤H8;
H12、判断所述当前字符串是否包含“;”,如果包含,则执行步骤H17;否则,执行步骤H13;
H13、将所述当前字符串中的第六预设字符串以及当前字符串中位于第六预设字符串之后的字符串作为解析结果写入所述缓冲区,获取第六预设字符串以及所述当前字符串中位于第六预设字符串之后的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H14、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H15、判断当前字符串中是否包含注释信息,如果包含,则执行步骤H16;否则,返回步骤H12;
H16、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H12;
H17、将所述当前字符串中的第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串作为解析结果写入所述缓冲区,获取第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串的长度之和,将所述第二偏移量的取值自加该长度之和,并返回步骤H8;
H18、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将所述第一变量的取值自加该差值,并返回步骤H8;
H19、判断所述第一变量的取值是否大于零,如果大于,则执行步骤H20;否则,执行步骤H21;
H20、获取所述当前字符串中的右括号的数量减去左括号的数量得到的差值,将所述第一变量的取值自减该差值,并返回步骤H8;
H21、判断所述第一变量的取值是否为零,如果为零,则执行步骤H23;否则,返回步骤H8;
H22、将所述当前字符串中的左括号以及所述当前字符串中位于该左括号之前的字符串作为解析结果写入所述缓冲区,获取该左括号和当前字符串中位于该左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H23、对函数返回类型变量的取值进行判断,如果所述函数返回类型变量的取值为第一预设值,则执行步骤H24;如果所述函数返回类型变量的取值为第二预设值,则执行步骤H25;如果所述函数返回类型变量的取值为第三预设值,则执行步骤H26;如果所述函数返回类型变量的取值为第四预设值,则执行步骤H27;如果所述函数返回 类型变量的取值为第五预设值,则执行步骤H28;
H24、将“}”作为解析结果写入所述缓冲区;
H25、将“}”作为解析结果写入所述缓冲区;
H26、将“return false;”作为解析结果写入所述缓冲区;
H27、将“return 0;”作为解析结果写入所述缓冲区;
H28、将“return null;”作为解析结果写入所述缓冲区。
11.如权利要求10所述的方法,其特征在于,所述第六预设字符串为“super(”、“super(”、“this(”和“this(”中的任一种。
12.如权利要求4所述的方法,其特征在于,将包括所述当前字符串在内的至少一条字符串作为无用对象进行解析,具体包括:
I1、判断所述第一偏移量的取值是否为零,如果为零,则执行步骤I2;否则,执行步骤I3;
I2、根据所述第一偏移量的取值,删除最近一次写入所述缓冲区的注释信息,将所述第二偏移量的取值赋值为所述第一偏移量的取值,并执行步骤I3;
I3、对所述当前字符串进行判断,如果所述当前字符串包含“class”或“interface”,或者为方法中的字符串,则执行步骤I9;如果所述当前字符串既不包含“class”或“interface”,也不是方法中的字符串,则执行步骤I4;
I4、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
I5、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
I6、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤I7;否则,执行步骤I8;
I7、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并执行步骤I8;
I8、判断所述当前字符串是否包含“;”,如果包含,则结束流程; 否则,返回步骤I5;
I9、将第二变量的取值设置为零;
I10、对所述当前字符串进行判断,如果所述当前字符串中的左括号的数量等于右括号的数量,则结束流程;如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤I11;如果所述当前字符串中的左括号的数量小于右括号的数量,则执行步骤I12;
I11、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将第二变量的取值自加该差值,并执行步骤I12;
I12、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
I13、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤I14;否则,执行步骤I15;
I14、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并执行步骤I15;
I15、对所述当前字符串进行判断,如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤I16;如果所述当前字符串中的左括号的数量小于右括号的数量,则执行步骤I17;如果所述当前字符串中的左括号的数量等于右括号的数量,则执行步骤I12;
I16、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将所述第二变量的取值自加该差值,并返回步骤I12;
I17、判断所述第二变量的取值是否为零,如果不为零,则返回步骤I12;如果为零,则结束流程。
13.一种解析源文件的装置,其特征在于,包括初始化模块、读取模块、第一判断模块、第一更新模块、第二更新模块、第二判断模块、第一解析模块、第二解析模块、第三解析模块、第四解析模块和写入模块,其中,
所述初始化模块,用于打开源文件,将所述源文件的起始位置作 为当前位置,并触发所述读取模块;
所述读取模块,用于从当前位置向后读取一行字符串;
所述第一判断模块,用于判断所述读取模块是否读取成功;
所述第一更新模块,用于在所述第一判断模块判断读取成功时,将读取到的一行字符串作为当前字符串,并将所述当前位置更新为位于所述当前字符串之后且与所述当前字符串相邻的位置,并触发所述第二判断模块;
所述第二判断模块,用于对所述当前字符串进行判断;
所述第一解析模块,用于在所述第二判断模块判断所述当前字符串为注释字符串时,将包括所述当前字符串在内的至少一条字符串作为注释字符串进行解析,将解析结果写入缓冲区,并触发所述读取模块;
所述第二解析模块,用于在所述第二判断模块判断所述当前字符串为空行时,将所述当前字符串写入缓冲区,并触发所述读取模块;
所述第二更新模块,用于在所述第二判断模块判断所述当前字符串不是注释字符串或者空行,但包含注释信息时,用于将当前字符串更新为所述当前字符串中除注释信息之外的其他内容,并触发所述第三解析模块;
所述第三解析模块,用于将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并触发所述读取模块;
所述第四解析模块,用于在所述第二判断模块判断所述当前字符串不是注释字符串或者空行,也不包含注释信息时,将包括当前字符串在内的至少一条字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入缓冲区,并触发所述读取模块;
所述写入模块,用于在所述第一判断模块判断读取失败时,将缓冲区中的内容写入目标文件。
14.如权利要求13所述的装置,其特征在于,所述当前字符串 为注释字符串,具体为:
所述当前字符串包含第一预设字符串,且所述当前字符串不包含位于所述第一预设字符串之前的字符串,所述第一预设字符串为“/*”、“/* ”、“//”和“// ”中的任一种。
15.如权利要求13所述的装置,其特征在于,所述当前字符串包含注释信息,具体为:
所述当前字符串中包含第一预设字符串,所述第一预设字符串为“/*”、“/* ”、“//”和“// ”中的任一种。
16.如权利要求13所述的装置,其特征在于,所述第一解析模块,包括清零子模块、第一判断子模块、第一解析子模块、更新子模块、第二判断子模块、删除子模块、第三判断子模块、第二解析子模块、第三解析子模块和第三解析子模块,其中,
所述清零子模块,用于在所述第二判断模块判断所述当前字符串为注释字符串时,将第一偏移量清零,并触发所述第一判断子模块,所述第一偏移量用于标识当最近一次写入缓冲区的内容为注释信息时,该注释信息在所述缓冲区中的起始位置相对于缓冲区的首地址的偏移量;
所述第一判断子模块,用于对所述当前字符串进行判断,如果所述当前字符串包含第二预设字符串但不包含第三预设字符串,则触发所述第一解析子模块;如果所述当前字符串包含第二预设字符串和第三预设字符串,则触发所述第三判断子模块;如果所述当前字符串不包含第二预设字符串,则触发所述第四解析子模块;
所述第一解析子模块,用于将所述第一偏移量的取值赋值为第二偏移量的取值,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,并触发所述更新子模块,所述第二偏移量用于标识最近一次写入缓冲区的解析结果在所述缓冲区中的结束位置相对于所述缓冲区的首地址的偏移量;
所述更新子模块,用于从当前位置向后读取一行字符串作为当前 字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置,并触发所述第二判断子模块;
所述第二判断子模块,用于判断所述当前字符串是否包含位于首尾的空格,如果包含,则触发所述删除子模块;否则,触发所述第一解析子模块;
所述删除子模块,用于将位于所述当前字符串的首尾的空格删除,并触发所述第一解析子模块;
所述第三判断子模块,用于判断所述当前字符串中是否存在位于第三预设字符串之后的字符串,如果存在,则触发所述第二解析子模块;否则,触发所述第四解析子模块;
所述第二解析子模块,用于将所述第一偏移量的取值赋值为所述第二偏移量的取值,将所述当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的第三预设字符串以及位于第三预设字符串之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和,将当前字符串更新为当前字符串中位于第三预设字符串之后的字符串,并触发所述第三解析子模块;
所述第三解析子模块,用于将所述当前字符串作为非注释字符串进行解析,在解析结果不为空时,将解析结果写入所述缓冲区,并触发所述读取模块;
所述第四解析子模块,用于将所述第一偏移量的取值赋值为所述第二偏移量的取值,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,并触发所述读取模块;
所述第三解析模块、所述第四解析模块和所述第三解析子模块,均包括第一判断单元、第二判断单元、第三判断单元、第一解析单元、第二解析单元、第三解析单元、第四解析单元、第五解析单元、第六解析单元、第七解析单元和第八解析单元,其中,
所述第一判断单元,用于对所述当前字符串进行判断,如果所述当前字符串包含第四预设字符串,则触发所述第一解析单元;如果所述当前字符串包含第五预设字符串,则触发所述第二判断单元;如果所述当前字符串包括右括号,则触发所述第三判断单元;如果所述当前字符串不包含第四预设字符串、第五预设字符串或者右括号,则触发所述第八解析单元;
所述第一解析单元,用于将包括所述当前字符串在内的至少一条字符串作为包含特殊字段的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
所述第二判断单元,用于对所述当前字符串进行判断,如果所述当前字符串包含“class”,则触发所述第二解析单元;如果所述当前字符串包含“interface”,则触发所述第三解析单元;如果所述当前字符串为方法中的字符串,则触发所述第四解析单元;如果所述当前字符串不包含“class”或“interface”,也不是方法中的字符串,则触发所述第五解析单元;
所述第二解析单元,用于将包括所述当前字符串在内的至少一条字符串作为类中的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
所述第三解析单元,用于将包括所述当前字符串在内的至少一条字符串作为接口中的字符串进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
所述第四解析单元,用于将包括所述当前字符串在内的至少一条字符串作为方法进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
所述第五解析单元,用于将包括所述当前字符串在内的至少一条字符串作为变量进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
所述第三判断单元,用于判断所述第一偏移量的取值是否为零, 如果为零,则触发所述第六解析单元;否则,触发所述第七解析单元;
所述第六解析单元,用于将右括号作为解析结果保存到写入所述缓冲区,将所述第二偏移量的取值自加该右括号的长度,将所述第一偏移量清零,并触发所述读取模块;
所述第七解析单元,用于根据所述第一偏移量的取值,删除最近一次写入所述缓冲区的注释信息,将所述第二偏移量的取值赋值为所述第一偏移量的取值;将右括号作为解析结果保存到写入所述缓冲区,将所述第二偏移量的取值自加该右括号的长度,将所述第一偏移量清零,并触发所述读取模块;
所述第八解析单元,用于将包括所述当前字符串在内的至少一条字符串作为无用对象进行解析,将所述第一偏移量清零,并触发所述读取模块。
17.如权利要求16所述的装置,其特征在于,所述第二预设字符串为“/*”或“/* ”,所述第三预设字符串为“*/”或“*/ ”;所述第四预设字符串为“package”或“import”,所述第五预设字符串为“public”或“protected”。
18.如权利要求16所述的装置,其特征在于,所述第二解析单元,具体用于执行以下操作:
D1、以空格作为分隔符,将所述当前字符串分隔成多个字符串,提取与字符串“class”相邻且位于字符串“class”之后的字符串;
D2、判断提取到的字符串是否包含左括号,如果包含,则执行步骤D3;否则,执行步骤D4;
D3、将提取到的字符串中位于左括号之前的内容存储为类名,将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,将所述第一偏移量清零,并触发所述读取模块;
D4、将提取到的字符串存储为类名;
D5、判断所述当前字符串中是否包含左括号,如果包含,则执 行步骤D6;否则,执行步骤D7;
D6、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度,将所述第一偏移量清零,并触发所述读取模块;
D7、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
D8、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤D9;否则,返回步骤D5;
D9、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤D5。
19.如权利要求16所述的装置,其特征在于,所述第三解析单元,具体用于执行以下操作:
E1、对所述当前字符串进行判断,如果所述当前字符串不包含左括号,则执行步骤E2;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量相同,则执行步骤E6;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量不相同,则执行步骤E7;
E2、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加当前字符串的长度;
E3、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
E4、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤E5;否则,返回步骤E1;
E5、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤E1;
E6、将所述当前字符串作为解析结果写入所述缓冲区,将所述第 二偏移量的取值自加所述当前字符串的长度,将所述第一偏移量清零,并触发所述读取模块;
E7、将所述当前字符串中的左括号以及位于左括号之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的左括号以及位于左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
E8、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
E9、将包括所述当前字符串在内的至少一条字符串作为接口体中的字符串进行解析,并在解析结果不为零时,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块。
20.如权利要求16所述的装置,其特征在于,所述第四解析单元,包括:
第一判断子单元,用于对所述当前字符串进行判断,如果所述当前字符串包含“abstract”或“native”,则触发第一解析子单元;如果所述当前字符串不包含“abstract”或“native”,则触发第二解析子单元;
提取子单元,用于在所述第一判断子单元判断所述当前字符串中包含“public”时,提取所述当前字符串中位于“public”和“(”之间的字符串;在所述第一判断子单元判断所述当前字符串中包含“protected”时,提取所述当前字符串中位于“protected”和“(”之间的字符串;
拆分子单元,用于根据所述提取子单元提取到的字符串包含的空格,将所述提取到的字符串拆分成多个字符串,得到包含上述多个字符串的字符串数组;
读取子单元,用于从所述拆分子单元拆分得到的所述字符串数组中读取一个未处理过的字符串;
第二判断子单元,用于对所述读取子单元读取到的字符串进行判 断,如果所述读取到的字符串为“abstract”、“native”、“static”或者“final”,则触发所述读取子单元;
设置子单元,用于在所述第二判断子单元判断所述读取到的字符串为“void”时,确定所述当前字符串对应的函数返回类型为void类型,将函数返回类型变量的取值设置为第二预设值;
在所述第二判断子单元判断所述读取到的字符串为“boolean”时,确定所述当前字符串对应的函数返回类型为boolean类型,将函数返回类型变量的取值设置为第三预设值;
在所述第二判断子单元判断所述读取到的字符串为“byte”、“short”或者“int”时,确定所述当前字符串对应的函数返回类型为基本类型,将函数返回类型变量的取值设置为第四预设值;
在所述第二判断子单元判断所述读取到的字符串不是“abstract”、“native”、“static”、“final”、“void”、“boolean”、“byte”、“short”或者“int”、且所述读取到的字符串与存储的类名不同或者所述读取到的字符串不是所述字符串数组的最后一个元素时,确定所述当前字符串对应的函数返回类型为特殊类型,将函数返回类型变量的取值设置为第五预设值;
在所述第二判断子单元判断所述读取到的字符串不是“abstract”、“native”、“static”、“final”、“void”、“boolean”、“byte”、“short”或者“int”、所述读取到的字符串与存储的类名相同,且所述读取到的字符串是所述字符串数组的最后一个元素时,确定所述当前字符串对应的函数返回类型为构造函数,将函数返回类型变量的取值设置为第一预设值;
第一解析子单元,用于将包括所述当前字符串在内的至少一条字符串作为特殊方法进行解析,将解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
第二解析子单元,用于将包括所述当前字符串在内的至少一条字符串作为普通方法进行解析,将解析结果写入所述缓冲区,将所述第 一偏移量清零,并触发所述读取模块。
21.如权利要求20所述的装置,其特征在于,所述第一解析子单元,具体用于执行以下操作:
G1、判断所述当前字符串是否包含“;”,如果包含,则执行步骤G5;否则,执行步骤G2;
G2、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
G3、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤G4;否则,并返回步骤G1;
G4、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤G1;
G5、将所述当前字符串中的“;”及“;”之前的字符串作为解析结果写入所述缓冲区,获取所述当前字符串中的“;”及“;”之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和,将所述第一偏移量清零,并触发所述读取模块。
22.如权利要求20所述的装置,其特征在于,所述第二解析子单元,具体用于执行以下操作:
H1、将第一变量的取值设置为零;
H2、对所述当前字符串进行判断,如果所述当前字符串不包含左括号,则执行步骤H3;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量不相同,则执行步骤H7;如果所述当前字符串包含左括号且所述当前字符串中的左括号的数量与右括号的数量相同,则执行步骤H22;
H3、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
H4、从当前位置向后读取一行字符串作为当前字符串,并将当 前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H5、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤H6;否则,返回步骤H2;
H6、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H2;
H7、将所述当前字符串中的左括号以及所述当前字符串中位于该左括号之前的字符串作为解析结果写入所述缓冲区,获取该左括号和当前字符串中位于该左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H8、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H9、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤H6;否则,返回步骤H11;
H10、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H11;
H11、对所述当前字符串进行判断,如果所述当前字符串包含第六预设字符串,则执行步骤H12;如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤H18;如果所述当前字符串中的右括号的数量大于左括号的数量,则执行步骤H19;如果所述当前字符串不包含第六预设字符串,且所述当前字符串中的右括号的数量等于左括号的数量,则执行步骤H8;
H12、判断所述当前字符串是否包含“;”,如果包含,则执行步骤H17;否则,执行步骤H13;
H13、将所述当前字符串中的第六预设字符串以及当前字符串中位于第六预设字符串之后的字符串作为解析结果写入所述缓冲区,获取第六预设字符串以及所述当前字符串中位于第六预设字符串之后的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H14、从当前位置向后读取一行字符串作为当前字符串,并将当 前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
H15、判断当前字符串中是否包含注释信息,如果包含,则执行步骤H16;否则,返回步骤H12;
H16、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并返回步骤H12;
H17、将所述当前字符串中的第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串作为解析结果写入所述缓冲区,获取第六预设字符串、“;”以及第六预设字符串与“;”之间的字符串的长度之和,将所述第二偏移量的取值自加该长度之和,并返回步骤H8;
H18、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将所述第一变量的取值自加该差值,并返回步骤H8;
H19、判断所述第一变量的取值是否大于零,如果大于,则执行步骤H20;否则,执行步骤H21;
H20、获取所述当前字符串中的右括号的数量减去左括号的数量得到的差值,将所述第一变量的取值自减该差值,并返回步骤H8;
H21、判断所述第一变量的取值是否为零,如果为零,则执行步骤H23;否则,返回步骤H8;
H22、将所述当前字符串中的左括号以及所述当前字符串中位于该左括号之前的字符串作为解析结果写入所述缓冲区,获取该左括号和当前字符串中位于该左括号之前的字符串的长度之和,将所述第二偏移量的取值自加该长度之和;
H23、对函数返回类型变量的取值进行判断,如果所述函数返回类型变量的取值为第一预设值,则执行步骤H24;如果所述函数返回类型变量的取值为第二预设值,则执行步骤H25;如果所述函数返回类型变量的取值为第三预设值,则执行步骤H26;如果所述函数返回类型变量的取值为第四预设值,则执行步骤H27;如果所述函数返回类型变量的取值为第五预设值,则执行步骤H28;
H24、将“}”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
H25、将“}”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
H26、将“return false;”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
H27、将“return 0;”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块;
H28、将“return null;”作为解析结果写入所述缓冲区,将所述第一偏移量清零,并触发所述读取模块。
23.如权利要求22所述的装置,其特征在于,所述第六预设字符串为“super(”、“super(”、“this(”和“this(”中的任一种。
24.如权利要求16所述的装置,其特征在于,所述第八解析单元,具体用于执行以下操作:
I1、判断所述第一偏移量的取值是否为零,如果为零,则执行步骤I2;否则,执行步骤I3;
I2、根据所述第一偏移量的取值,删除最近一次写入所述缓冲区的注释信息,将所述第二偏移量的取值赋值为所述第一偏移量的取值,并执行步骤I3;
I3、对所述当前字符串进行判断,如果所述当前字符串包含“class”或“interface”,或者为方法中的字符串,则执行步骤I9;如果所述当前字符串既不包含“class”或“interface”,也不是方法中的字符串,则执行步骤I4;
I4、将所述当前字符串作为解析结果写入所述缓冲区,将所述第二偏移量的取值自加所述当前字符串的长度;
I5、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
I6、判断所述当前字符串中是否包含注释信息,如果包含,则执 行步骤I7;否则,执行步骤I8;
I7、将当前字符串更新为当前字符串中除注释信息之外的其他内容,并执行步骤I8;
I8、判断所述当前字符串是否包含“;”,如果包含,则将所述第一偏移量清零,并触发所述读取模块;否则,返回步骤I5;
I9、将第二变量的取值设置为零;
I10、对所述当前字符串进行判断,如果所述当前字符串中的左括号的数量等于右括号的数量,则将所述第一偏移量清零,并触发所述读取模块;如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤I11;如果所述当前字符串中的左括号的数量小于右括号的数量,则执行步骤I12;
I11、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将第二变量的取值自加该差值,并执行步骤I12;
I12、从当前位置向后读取一行字符串作为当前字符串,并将当前位置更新为位于当前字符串之后且与该当前字符串相邻的位置;
I13、判断所述当前字符串中是否包含注释信息,如果包含,则执行步骤I14;否则,执行步骤I15;
I14、将所述当前字符串更新为当前字符串中除注释信息之外的其他内容,并执行步骤I15;
I15、对所述当前字符串进行判断,如果所述当前字符串中的左括号的数量大于右括号的数量,则执行步骤I16;如果所述当前字符串中的左括号的数量小于右括号的数量,则执行步骤I17;如果所述当前字符串中的左括号的数量等于右括号的数量,则执行步骤I12;
I16、获取所述当前字符串中的左括号的数量减去右括号的数量得到的差值,将所述第二变量的取值自加该差值,并返回步骤I12;
I17、判断所述第二变量的取值是否为零,如果不为零,则返回步骤I12;如果为零,则将所述第一偏移量清零,并触发所述读取模块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210299029.5A CN102855306B (zh) | 2012-08-21 | 2012-08-21 | 一种解析源文件的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210299029.5A CN102855306B (zh) | 2012-08-21 | 2012-08-21 | 一种解析源文件的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102855306A CN102855306A (zh) | 2013-01-02 |
CN102855306B true CN102855306B (zh) | 2015-04-15 |
Family
ID=47401894
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210299029.5A Expired - Fee Related CN102855306B (zh) | 2012-08-21 | 2012-08-21 | 一种解析源文件的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102855306B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107341135B (zh) * | 2017-05-24 | 2019-11-05 | 中国科学院信息工程研究所 | 一种面向通用文本格式的解析方法及工具 |
CN110222286A (zh) * | 2019-05-21 | 2019-09-10 | 平安普惠企业管理有限公司 | 信息获取方法、装置、终端和计算机可读存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101216768A (zh) * | 2008-01-14 | 2008-07-09 | 北京中星微电子有限公司 | 一种嵌入式平台命令解析系统及运行的方法 |
CN101651683A (zh) * | 2009-08-28 | 2010-02-17 | 重庆重邮东电通信技术有限公司 | 一种信令消息解析源代码生成方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5701487A (en) * | 1995-03-27 | 1997-12-23 | Sun Microsystems, Inc. | Method and apparatus for displaying locations of errors detected inside software macro calls |
-
2012
- 2012-08-21 CN CN201210299029.5A patent/CN102855306B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101216768A (zh) * | 2008-01-14 | 2008-07-09 | 北京中星微电子有限公司 | 一种嵌入式平台命令解析系统及运行的方法 |
CN101651683A (zh) * | 2009-08-28 | 2010-02-17 | 重庆重邮东电通信技术有限公司 | 一种信令消息解析源代码生成方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102855306A (zh) | 2013-01-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102200911B (zh) | 变量闭包 | |
CN108681457B (zh) | 基于代码下沉与残码解释的Android应用程序保护方法 | |
US8370835B2 (en) | Method for dynamically generating a configuration for a virtual machine with a virtual hard disk in an external storage device | |
CN107608677A (zh) | 一种编译处理方法、装置及电子设备 | |
EP3161642A1 (en) | Techniques for edit-and-continue and enhanced optimized debugging on optimized code | |
JP6418696B2 (ja) | 命令セットシミュレータおよびそのシミュレータ生成方法 | |
CN112052006A (zh) | 一种软件代码编译方法及系统 | |
CN104866734A (zh) | 一种dex文件的保护方法及装置 | |
CN105094941B (zh) | 一种实现多语言的方法及装置 | |
JP5846581B2 (ja) | コードを投機的に最適化するための方法、並びにそのコンピュータ及びコンピュータ・プログラム | |
CN102855306B (zh) | 一种解析源文件的方法和装置 | |
CN111597514A (zh) | 安卓源代码保护方法和装置 | |
CN101533346A (zh) | 源文件的比较装置及方法 | |
JP2005522772A (ja) | コンパイラ生成プログラムコードの最適化 | |
US9477496B2 (en) | Method and apparatus for loading classes and re-organizing class archives | |
Anderson | A computer for direct execution of algorithmic languages | |
US9098355B2 (en) | Method and apparatus for substituting compiler built-in helper functions with machine instructions | |
US20240231864A9 (en) | Hybrid just in time load module compiler with performance optimizations | |
CN110032425A (zh) | 一种动态链接库文件虚拟化方法、系统及存储介质 | |
US10310871B2 (en) | Non-transitory computer-readable recording medium storing control program, control device and control method | |
CN102411534B (zh) | 一种断点调试方法和断点调试装置 | |
CN114238227A (zh) | 软件项目源代码中文查找方法、系统及介质 | |
CN111796832B (zh) | 热补丁文件生成方法、装置、设备及存储介质 | |
CN115237405A (zh) | 指令级代码复用分析方法及指令级代码复用方法 | |
KR101088516B1 (ko) | 수행 중 선행 컴파일링을 이용한 내장형 시스템을 위한 자바 컴파일링 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20150415 |