大学时,编译原理,离散数学等没有学好,以为用处不大,现在才觉得越来越重要。    例如:我们要分析项目中的java源代码,查找不符合我们规范的代码,这些查找需要分析java语言的语法,不是仅仅通过正则表达式等所能做到的。
    再例如:任意一给定的sql,我们要进行sql分析及信息提取,就象hibernate 3用antlr分析hql一样。
    其他如:格式转换,脚本引擎等都需要用到编译原理相关知识。最近我看了一下antlr,想用它来做java语言的语法分析器,进行java源代码的分析,下面我们从一个简单的需求开始:    需求:我想查找下面的源代码中所有没有被注释的System.out.printlnimport antlr.CommonAST;
import antlr.debug.misc.ASTFrame;import java.io.StringReader;public class TestSample2 {
    public static void main(String[] args) {
        try {
              StringReader sr = new StringReader("3-4*5+2-2^1*3-3*9-1;");
              ExpressionLexer lexer = new ExpressionLexer(sr);              ExpressionParser parser = new ExpressionParser(lexer);
              parser.expr();              CommonAST parseTree = (CommonAST)parser.getAST();
              
      // System.out.println(sr);       /*
       System.out.println(parseTree.toStringList());
       System.out.println("…………"); 
       */       System.out.println(parseTree.toStringList());//只有这个System.out.println才是我们要找的
            
              ASTFrame frame = new ASTFrame("The tree", parseTree);
              frame.setVisible(true);     } catch(Exception e) { System.err.println("Exception: "+e); }
          }
}
请各位有经验的高手指导,大家如果有antlr应用等方面的资料也请提供,谢谢!

解决方案 »

  1.   

    等我GOOLE到了资料给你。把你的邮箱留下
      

  2.   

    我的意思就是想用antlr做一个java语言的语法分析器。
      

  3.   

    并实现一个简单的java语法分析,我想查找下面的源代码中所有没有被注释的System.out.printlnpublic class TestSample2 {
        public static void main(String[] args) {
                                
          // System.out.println(sr);      /*
           System.out.println(parseTree.toStringList());
           System.out.println("…………"); 
           */      System.out.println(parseTree.toStringList());//只有这个System.out.println才是我们要找的
                
                }
    }
      

  4.   

    我运行了一遍antlr的examples,里面有java的解释器,但有些代码看不懂,哎,编译原理的基础没有打好啊!不知那位高手能详细的讲解一下antlr的example(java解释器例子),并修改实现上面的需求,谢谢各位了!如果有好的资料也请告诉我,再次感谢!
      

  5.   

    我想查找下面的源代码中所有没有被注释的System.out.println用不着语法分析这么麻烦吧,写个小程序,读你要分析的源代码,用正则表达式去做个匹配就可以了
      

  6.   

    to whyxx(漆黑中的萤火虫):我仅仅是举个简单的例子,当然我要做的分析不会这么简单,也不是几个正则表达式就能搞定的。我需要的是该问题的编译原理解决方案,这样才能更灵活,而且有些问题只有分析语法才能解决。
      

  7.   

    请各位高手多多指导,其实我的目的就是:静态分析项目中的Java源程序,发现代码问题,例如没有用到的变量、多余的变量创建操作、空的catch块,没有加开关的log4j日志代码,此外,还需要检查Java代码是否符合我们项目特定的编码规范等等。说白了,就想做个类似PMD的东西,只不过我可能还会包括代码生成,sql分析等功能。
      

  8.   

    你的要求可能通过定义checkstyle来实现,很容易的啊,装个eclipse的插件就可以了
      

  9.   

    谢谢whyxx(漆黑中的萤火虫)的建议,但checkstyle有些功能实现不了,而且我也说了,我还会集成代码生成,sql分析等功能。
      

  10.   

    我没有用过 antlr,如果搂主只是需要“查找所有没有被注释的System.out.println”,那么用正则表达式也可以想办法实现。如果目的是“静态分析项目中的Java源程序,发现代码问题,例如没有用到的变量、多余的变量创建操作、空的catch块,没有加开关的log4j日志代码,此外,还需要检查Java代码是否符合我们项目特定的编码规范等等”的话,我想这的确是非常复杂的,为什么不直接选用一个工具呢,这么复杂的功能一般是一个公司在运营的。我们现在用的是一款叫作 pc-lint 的软件。如果搂主坚持自己做,我也会继续关注,在能帮上忙的帮帮忙。
      

  11.   

    谢谢sswater(光杆兵),谢谢各位高手,我现在也使用PMD等静态分析Java源程序的工具:http://www-128.ibm.com/developerworks/cn/java/j-pmd/?ca=dwcn-newsletter-java但我不想仅仅是生成一个检查报告,对于某些问题代码,我希望工具能自动的修改。其次,自己做的工具有更好的灵活性,也能很方便的增加功能,当然我也可以在已有的开源工具的基础上开发,改进。总之,我没有这方面的经验,所以请各位高手指点,少走弯路!
      

  12.   

    sswater(光杆兵)兄:pc-lint是检查c,c++代码的工具,我现在主要是检查java的代码,
    你说的可以检查没有没有加开关的log4j日志代码是什么工具?谢谢!
      

  13.   

    我上次给 rambostar 兄回答的 "检查没有没有加开关的log4j" 是使用正则表达式的方法。更复杂的要求不知道用正则表达式能不能实现。
      

  14.   

    谢谢各位高手,我的目的主要如下:1:对于PMD等静态分析Java源程序的工具,我不想仅仅是得到一个检查报告,对于某些问题代码,我希望工具能自动的修改;2:自己动手分析java语言,能很方便的增加功能,例如:增加重构功能,自动生成源代码等;3:我打算在已有的开源工具的基础上开发,也可能利用Eclipse中的Java开发环境(JDT)提供的源代码解析和编辑工具。总之,我没有这方面的经验,所以请各位高手指点,少走弯路!
      

  15.   

    利用antlr可以很容易的把java源代码转换成AST树,可是反过来,我修改了AST树后,怎么得到相应的修改后的java源代码?而且保留原来的源代码格式及注释。谢谢!
      

  16.   

    此问题的另一给分点,请各位告诉继续关注:http://community.csdn.net/Expert/topic/4481/4481699.xml?temp=5.730838E-02