【问题标题】:How to detect the end of a method body of a java file using kotlin?如何使用 kotlin 检测 java 文件方法体的结尾?
【发布时间】:2021-01-07 18:31:08
【问题描述】:

假设我们有一个如下所示的 java 文件:

class Something {

   public static void main(String[] args){
      
      System.out.println("Hello World!");
   
   }

}

我想编写一些 Kotlin 代码,通过这个 java 文件并检测方法体中有多少行(这里只是主要方法)。计算空行!

我的方法是简单地使用 File forEachline 方法逐行读取 java 文件。我可以编写代码来检测方法签名。现在我希望能够确定该方法的结束位置。我不知道该怎么做。

如果我只是寻找“}”,我的代码可能会出错,假设我们位于方法主体的末尾,而实际上我们位于方法内 if 语句主体的末尾。

我怎样才能避免这个陷阱?

【问题讨论】:

  • 当你看到{时增加括号,当你看到}时减少括号当你回到零时,你知道这是方法的结束。
  • @Tenfour04 他是对的

标签: java kotlin text-parsing


【解决方案1】:

解决此问题的一种方法是跟踪看到的左括号('{')和右括号('}')的数量。在方法开始时,计数将递增到 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 所指出的,这个伪代码是不够的。更完整的答案需要包括并非所有括号都会影响方法结构的事实。解决此问题的一种方法是跟踪正在解析的当前字符的上下文。仅在有效上下文(非字符串文字、注释等)中增加/减少 numBrackets。尽管正如 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

【讨论】:

  • 这会被字符常量、字符串常量和 cmets 中的大括号弄糊涂。您应该可以忽略这些,尽管代码会复杂得多(尤其是考虑到转义的双引号后)。你可能最好减少现有的 Java 解析器——或者至少从 Java language spec 中读取语法。
  • 感谢吉德斯!将更新评论以反映这一点。
猜你喜欢
  • 2015-02-05
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
相关资源
最近更新 更多