0

現在、テキスト エディターで Java のコレクターを開発しています。そのためには、Pattern を使用して Java 構文の要素 (インポートまたはパッケージの宣言、クラスまたはメソッドの宣言など) を探すのが最善の方法だと思います。私はすでにこれらのパターンのいくつかを書いています:

private String regimport = "^import(\\s+)(static |)(\\w+\\.)*(\\w+)(\\s*);(\\s*)$",
                regpackage="^package(\\s+)[\\w+\\.]*[\\w+](\\s*);(\\s*)$",
                regclass="^((public(\\s+)abstract)|(abstract)|(public)|(final)|(public(\\s+)final)|)(\\s+)class(\\s+)(\\w+)(((\\s+)(extends|implements)(\\s+)(\\w+))|)(\\s*)(\\{)?(\\s*)$";

今のところそれほど難しいことではありませんが、達成するには長い時間がかかるのではないかと心配しています。似たようなものが既に存在するかどうか誰かが知っていますか?

4

3 に答える 3

2

そうするための最良の方法は、Patternを使用してJava構文の要素を探すことだと思います

正しくない。正規表現パターンでは、Java構文要素を適切に識別できません。そのため、はるかに複雑なパーサーが存在します。簡単な例として、次のように、コメント内の予約語の誤一致を回避する方法を想像してみてください。

/* this is not importing anything
import java.util.*;
*/

ただし、正規表現の使用に非常に熱心で、多くの労力を費やすことをいとわない場合は、を見てくださいEmacs font-lock-mode。これは、正規表現を使用して構文要素を識別およびフォント化します。

PS:私が言及する「多くの努力」とは、どのように機能するかを学び、コードをEmacs読み、正規表現をJavaに変換することを指します。あなたがすでにそれをすべて知っているなら、あなたはより少ない努力を必要とするでしょう。elispEmacs

于 2012-10-03T17:30:52.693 に答える
1

回答ありがとうございます。私はjavaparser ASTを使って作業するつもりだと思います。それはずっと簡単になるでしょう:)

ASTでエラーをチェックするコードは次のとおりです

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import org.eclipse.jdt.core.compiler.IProblem;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;

public class Main {

    public static void main(String[] args) {

        ASTParser parser = ASTParser.newParser(AST.JLS2);
        FileInputStream in=null;
        try {
            in = new FileInputStream("/root/java/Animbis.java"); //your personal java source file
            int n;
            String text="";
            while( (n=in.read()) !=-1) {
                text+=(char)n;
            }
            CompilationUnit cu;
            // parse the file
            parser.setSource(text.toCharArray());
            in.close();
        }catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        CompilationUnit unit = (CompilationUnit) parser.createAST(null); 
        //unit.recordModifications();
        AST ast = unit.getAST(); 


        IProblem[] problems = unit.getProblems();
        boolean error = false;
        for (IProblem problem : problems) {
           StringBuffer buffer = new StringBuffer();
           buffer.append(problem.getMessage());
           buffer.append(" line: ");
           buffer.append(problem.getSourceLineNumber());
           String msg = buffer.toString(); 
           if(problem.isError()) {
              error = true; 
              msg = "Error:\n" + msg;
           }    
           else 
              if(problem.isWarning())
                 msg = "Warning:\n" + msg;

           System.out.println(msg);  
        }

    }


}

次の jar で実行するには:

org.eclipse.core.contenttype.jar
org.eclipse.core.jobs.jar
org.eclipse.core.resources.jar
org.eclipse.core.runtime.jar
org.eclipse.equinox.common.jar
org.eclipse.equinox.preferences.jar
org.eclipse.jdt.core.jar
org.eclipse.osgi.jar

Eclipse ASTParserおよびASTParser のから情報 を取得しました

于 2012-10-04T01:32:36.337 に答える
0

Javaの完全な構文をRegExで解析することはできません。それらは異なるクラスの言語です。Javaは少なくともChomskyタイプ2言語ですが、RegExはタイプ3であり、タイプ2はタイプ3よりも基本的に複雑です。RegExを使用したHTMLの解析に関するこの有名な回答も参照してください...これは本質的に同じ問題です。

于 2012-10-03T17:33:00.617 に答える