【问题标题】:Finding if conditions in .java file查找 .java 文件中的 if 条件
【发布时间】:2017-03-05 11:54:04
【问题描述】:

我试图创建一个方法来查找 .java 文件中的所有 if 条件(我假设该文件只包含正确的 if 指令)。 它应该计算所有“如果”,但不包括那些被 cmets 环绕或被踩为字符串的“如果”。 我试图用StringTokenizer解决这个问题,但我不知道“//”符号后的省略线和用“”包围的字符串。有没有可能以这种方式实现这个问题?

public int getIfCount()
{
    int counter = 0;
    String t = "";

    try 
    {
        FileReader file = new FileReader(path);

        StringBuffer sb = new StringBuffer();

        int tmp;

        while ((tmp = file.read()) != -1)
        {
            sb.append((char)tmp);
        }

        t = sb.toString();

        StringTokenizer stk = new StringTokenizer(t);

        String token;


        while (stk.hasMoreTokens())
        {
            token = stk.nextToken();

             if (token.contains("/*"))
            {
                while (stk.hasMoreTokens())
                {
                    if (stk.nextToken().contains("*/"))
                        break;
                }
            }
            else if (token.contains("//"))
            {
                while (stk.hasMoreTokens() && stk.nextToken() != "\n")
                {
                    if (stk.nextToken().endsWith("\n"))
                        break;
                }
            }
            else if (token.contains("\""))
            {
                if (!token.endsWith("\""))
                    while (stk.hasMoreTokens())
                    {
                        if(stk.nextToken().contains("\""))
                            break;
                    }
            }
            else if (token.startsWith("if"))
                counter++;
        }
    } 

    catch (FileNotFoundException e) 
    {
        System.out.println("This file does not exist!");
    } 
    catch (IOException e) 
    {
        System.out.println("ERROR");
    }

    return counter;
}

【问题讨论】:

  • 回答您提出的问题,是的,有可能。否则编译器将如何工作?
  • 我建议您使用 StringBuilder,因为 StringBuffer 在十多年前已被弃用。不要使用startsWith,因为您可能拥有iffy 令牌。如果代码没有达到您的预期,我建议您在调试器中逐步执行代码。注意:你可以在 cmets 中有代码
  • 要涵盖所有边界情况,您需要进行完整的 Java 词法分析,然后计算关键字“if”出现的频率。 (除了您提到的情况外,边界情况是 unicode 转义。\u0069f 也是“如果”)。
  • StringTokenizer 也已过时(他们推荐String.split())(当然,如果您愿意,可以使用过时的课程;就我而言,我总是尝试学习新课程)。
  • 我认为您使用StringTokenizer 会使事情复杂化(String.split() 也会如此)。有些人写if(i > 0),而另一些人在if 后面加一个空格。我什至可以写i++;if(i > 0),而if 不会在你的令牌的开头。同样在"My string" 中,引号将出现在不同的标记中,但在"a"+x+"b" 中,您突然在一个标记中包含四个引号。不要忘记字符串中的\"。我认为您需要其他方式将输入拆分为令牌。

标签: java stringtokenizer


【解决方案1】:

无需自己实现。您正在做的是实现解析器的基础知识。虽然对解析时发生的事情有所了解是件好事,但我建议使用诸如https://github.com/javaparser/javaparser 之类的库。玩得开心。

【讨论】:

  • 是的,它是......我不知道如何处理它。所以我需要一些提示,我可以使用哪些结构。我认为完成的解决方案不合适。 :( 顺便说一句。我们假设“if”具有正确的语法,所以只有 cmets 和不同的编程风格,例如(if() 或 if () 等)是有问题的。正则表达式也不能在那里工作?:(
  • 在这种情况下,您必须通过char imho 转到char,以跟踪可能找到的if 是否也在有效上下文中(不是评论 - 多行与否,而不是另一个词的一部分,无论是变量、函数/方法还是类型)​​。左大括号和方括号后面可能跟也可能不跟空格,然后跟 if 等等。这是相当复杂的东西。好吧,我希望你得到/得到一些灵感。祝你好运。
猜你喜欢
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多