如何使用kotlin检测java文件的方法体的结尾?
假设我们有一个如下所示的java文件:如何使用kotlin检测java文件的方法体的结尾?,java,kotlin,text-parsing,Java,Kotlin,Text Parsing,假设我们有一个如下所示的java文件: class Something { public static void main(String[] args){ System.out.println("Hello World!"); } } 我想编写一些Kotlin代码来遍历这个java文件,并检测方法体中有多少行(这里仅是主方法)。空行被计算在内 我的方法是简单地使用fileforeachline方法逐行读取java文件。我可
class Something {
public static void main(String[] args){
System.out.println("Hello World!");
}
}
我想编写一些Kotlin代码来遍历这个java文件,并检测方法体中有多少行(这里仅是主方法)。空行被计算在内
我的方法是简单地使用fileforeachline方法逐行读取java文件。我可以编写代码来检测方法签名。现在我希望能够确定方法的结束位置。我不知道怎么做
如果我只是查找“}”,那么假设我们在方法体的末尾,而实际上我们在方法中的If语句体的末尾,我的代码可能会出错
如何避免这个陷阱?一种方法是跟踪所看到的开括号(“{”)和闭括号(“}”)的数量。在方法开始时,计数将增加到1。假设该方法的结构有效,则在该方法结束时,未闭合括号的数量应为0。这样的伪代码应该可以工作:
int numLines = 1 (assuming method start line counts)
int numBrackets = 1 (after finding method open bracket for method)
while(numBrackets > 0)
if char = '{' -> numBrackets++
if char = '}' -> numBrackets--
if char = newline -> numLines++
if numBrackets not 0 -> FAIL
return numLines
编辑
正如下面Gidds所指出的,这个伪代码是不够的。一个更完整的答案需要包括一个事实,即并非所有括号都会影响方法结构。一种方法是跟踪正在解析的当前字符的上下文。只有在有效上下文(非字符串文字、注释等)中时才递增/递减。尽管正如Gidds所指出的,这将增加复杂性。更新的伪代码:
int numLines = 1
int numValidBrackets = 1
Context context = Context(MethodStructure)
while(numValidBrackets > 0)
context.acceptNextChar(char)
if char = newline -> numLines++
if(context.state() != MethodStructure) continue;
if char = '{' -> numValidBrackets++
if char = '}' -> numValidBrackets--
if numBrackets not 0 -> FAIL
return numLines
一种方法是跟踪所看到的开括号('{')和闭括号('}')的数量。在方法开始时,计数将增加到1。假设该方法的结构有效,则在该方法结束时,未闭合括号的数量应为0。这样的伪代码应该可以工作:
int numLines = 1 (assuming method start line counts)
int numBrackets = 1 (after finding method open bracket for method)
while(numBrackets > 0)
if char = '{' -> numBrackets++
if char = '}' -> numBrackets--
if char = newline -> numLines++
if numBrackets not 0 -> FAIL
return numLines
编辑
正如下面Gidds所指出的,这个伪代码是不够的。一个更完整的答案需要包括一个事实,即并非所有括号都会影响方法结构。一种方法是跟踪正在解析的当前字符的上下文。只有在有效上下文(非字符串文字、注释等)中时才递增/递减。尽管正如Gidds所指出的,这将增加复杂性。更新的伪代码:
int numLines = 1
int numValidBrackets = 1
Context context = Context(MethodStructure)
while(numValidBrackets > 0)
context.acceptNextChar(char)
if char = newline -> numLines++
if(context.state() != MethodStructure) continue;
if char = '{' -> numValidBrackets++
if char = '}' -> numValidBrackets--
if numBrackets not 0 -> FAIL
return numLines
当你看到
{
时递增,当你看到}
时递减,当你回到零时,你知道这是方法的结束。@Tenfour04他是对的,当你看到{
时递增,当你看到
时递减,当你回到零时,他是对的,你知道这是方法的结束。@Tenfour04他是对的,他会被字符常量、字符串常量和注释中的大括号弄糊涂。您应该能够忽略这些,尽管代码要复杂得多(特别是考虑到转义双引号后)。您可能最好减少现有的Java解析器,或者至少从中读取语法。谢谢gidds!将更新注释以反映这一点。这将被字符常量、字符串常量和注释中的大括号所混淆。您应该能够忽略这些,尽管代码要复杂得多(特别是考虑到转义双引号后)。您可能最好减少现有的Java解析器,或者至少从中读取语法。谢谢gidds!将更新评论以反映这一点。