Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用kotlin检测java文件的方法体的结尾?_Java_Kotlin_Text Parsing - Fatal编程技术网

如何使用kotlin检测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文件。我可

假设我们有一个如下所示的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!将更新评论以反映这一点。