【问题标题】:Find the start and end of a Java function查找 Java 函数的开始和结束
【发布时间】:2013-02-21 00:38:46
【问题描述】:

在Java中,是否可以为Java源代码示例生成相应的大括号,给定源代码作为字符串,以及大括号的开头?

public class FindFunctionStartAndEnd{
    public static Object findCorrespondingCurlyBrace(String sourceCode, string startingPosition){
        //return the string position that corresponds to the matching curly brace
        //the input string should be the source code of a Java class
        //if sourceCode is not valid Java code, return false
    }
}

【问题讨论】:

  • 许多 Java IDE(如 Eclipse)在光标位于其中一个大括号前面时突出显示相应的大括号。我很好奇大多数 IDE 将如何实现此功能。
  • @OliCharlesworth 哪个解析器可用于此目的,“他们”是谁?
  • 为了正确匹配花括号,我需要找到一种方法来处理字符串文字中的花括号,例如:public static void printStuff(){ System.out。 println("这个方法可能很难解析。}")}
  • 这是一个更复杂的问题:stackoverflow.com/q/5497210/422353
  • @AndersonGreen 为什么不看看 Eclipse 的源代码? (虽然我相信代码不会很容易阅读。)

标签: java metaprogramming syntax-highlighting


【解决方案1】:

您需要遍历字符串并从起始位置开始计算开括号和右括号并将它们匹配起来。问题是,有几种情况你需要忽略它们(这里只是几个例子):

  • 在行注释中(//“新行”
  • 在块注释中(在/*(不被行注释隐藏)和*/之间)
  • String 文字中(在两个匹配的" 之间(忽略转义(\",但注意\\"\\\"!)))
  • char 文字中(在两个匹配的' 之间)
  • 可能更多

您可以在遍历字符串时保留所有这些计数器,或者您可以提出一个匹配整个函数体(包括列表中的所有这些情况)的正则表达式,然后应用一次并查看您的匹配索引在找到正文后结束。

为了在所有情况下都做正确的事情,任何一个都应该有点参与,所以我建议你去谷歌看看你是否能找到一些预制正则表达式的例子。

【讨论】:

  • 我想知道是否有任何现有的 Java 解析器可以使这项任务变得更容易。我几乎可以肯定——许多 Java IDE 之前已经实现了这个特性。 ://
  • @AndersonGreen 从 Antlr 上方 cmets 中的链接似乎可以做到这一点。我不确定性能是否会成为您关心的问题,但最快的解决方案可能是专门针对这种情况的正则表达式(而不是成熟的语法解析器)或您自己的计数方法。任何通用 Java 解析器都可能会增加大量不必要的开销。
  • 计数方法可能不会太难上手。只需构建第一个版本并在遇到越来越多的异常时继续扩展其逻辑(例如在查找字符串结尾时需要忽略的字符串内部的转义 ""...\"..."))。但是,不确定您是否只想自己使用它并且这种调试方法还可以,或者是否需要为生产做好准备。
  • 我认为计数更好,因为OP不需要构建完整的语法树。
  • 你不能通过应用一个大的正则表达式来解决这个问题。
猜你喜欢
  • 2012-10-18
  • 2023-04-02
  • 2023-03-30
  • 2020-02-17
  • 1970-01-01
  • 2010-10-05
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多