消除源代码文件代码中的注释并打印代码(没有文件中的注释)

时间:2012-05-18 14:23:32

标签: java

例如,请考虑以下文字:

import java.util.*;

/* My program
by           */
public class Program {
   public static void main(String[] args) {
      System.out.println("Hello, world!"); // a println
   }

   public static /* Hello there */ void foo() {
      System.out.println("Goodbye!"); // comment here
   } /* */
}

如果文件包含此文本,程序应输出以下文本:

import java.util.*;

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

   public static  void foo() {
      System.out.println("Goodbye!");
   }
}

我为它编写了代码,并命名了一个名为stripComments的函数,该函数接受相关文件的扫描程序输入:

public void stripComments(Scanner input){

    while(input.hasNextLine()){
        boolean flag=false;

        String scan=input.nextLine();
        Scanner line=new Scanner(scan);
        while(line.hasNext()){

            String token=line.next();
            if(token.equals("/*")){
                while(line.hasNext()){

                    if(line.next().equals("\\*")){
                        token=line.next();
                        flag=true;
                        break;
                    }
                }
                if(!flag){
                    while(input.hasNextLine()){
                        scan=input.nextLine();
                        line=new Scanner(scan);


                        while(line.hasNext()){

                            token=line.next();
                            if(token.equals("*\\")){

                                token=line.next();
                                flag=true;
                                break;
                            }
                        }

                    }

                }
            }
            else{
                System.out.print(token+" ");

            }


        }
        System.out.println();


    }

}

然而,产生的输出是:

import java.util.*; 

就是这样!!!!

有人可以指出我哪里出错吗?

3 个答案:

答案 0 :(得分:0)

flag设置为true后,您将使用第二个

中的整个输入
while(input.hasNextLine()){ 
  //...
}

块。

另外,(一旦你解决了这个问题):一旦你设置了flag,就永远不会取消它

答案 1 :(得分:0)

您的代码中没有找到*/,这标志着多行注释的结束。结果,一旦评论从第2行开始,它就永远不会结束。

此外,对于此特定任务,我建议一次查看输入的一个字符,而不是一次查看一个Scanner标记。加上一个简单的state machine,这可以带来简单而强大的实现。

答案 2 :(得分:0)

你应该在整个文件内容上使用2个常规表达式(对于/ ** /和//),而不是逐行工作。