源代码解析和格式化

时间:2016-07-14 08:18:48

标签: java

问题:

  1. 阅读源代码文件(例如.java)
  2. 删除所有空行
  3. 删除所有评论
  4. 删除循环之间不必要的空格
    示例

    for ( int i = 0, int j = 0   ; i < = data.length, j   <  44; i++ , j++) 
    

    成为

    for(int i=0,int j=4;i<=data.length,j<44;i++,j++)
    
  5. 更改大括号:

    void sleep(){
        return;
    }
    

    void sleep()
    {
        return;
    }
    
  6. 我已经为 1 3 创建了使用正则表达式工作的功能。

    但是对于 4 ,我编写了一个单独的String fixFor(String forCode)函数,我必须手动修改所有fors。 有没有人知道一个程序化的解决方案,即Java程序,而不使用文本编辑器的查找和替换功能? 我正在使用:

    将我的源代码文件读入String
        String s=new String(readAllBytes(get("Code.java")));
    

    同样对于 5 ,可以很容易地将所有{替换为{\n,但缩进不会保持有效。

1 个答案:

答案 0 :(得分:1)

问题有点模糊,因为我不确定解决方案代码是仅仅使用带有宏的文本编辑器,还是使用Java中的源代码是否需要。

对于4您可以使用模式迭代该行并从您正在解析的任何语言中查找关键字列表中的实例,然后随后处理已找到的任何组,这是否意味着替换字符串中的组或复制他们改造原始字符串只保留未经修改的匹配组:

/*
 * StackOverflow example
 * 
 * 
 */
package javaapplication5;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author dean2191
 */
public class JavaApplication5 {

    public static void main(String[] args) {
        String code = "for ( int i = 0, int j = 0   ; i < = data.length, j   <  44; i++ , j++) ";
        List yourKeywords = new ArrayList();
        yourKeywords.add("int");
        yourKeywords.add("boolean"); //any keywords,could read them from a file
        Iterator<String> iterator = yourKeywords.iterator();

        Pattern pattern = Pattern.compile("(" + iterator.next() + "\\s"+"[a-zA-Z0-9]" + ")");
        Matcher m = pattern.matcher(code);

        while (iterator.hasNext()) {

            if (m.find()) {
                System.out.println("group to keep found:"+m.group());
            }
        }
    }

}

此代码的输出将为:

group to keep found:int i
group to keep found:int j

如上所述,您可以复制此组并生成一个新字符串,确保这些组是唯一没有空格的部分,如果这是您真正想要的。

然而,根据您实际想要对语言进行多少解析,考虑诸如ANTLR之类的解决方案来获得更强大的解析解决方案可能是值得的。