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工作,阅读elisp代码并将Emacs正则表达式翻译成Java。如果您已经知道所有这些,那么您将需要更少的努力。

于 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 的完整语法。它们是不同类别的语言。Java 至少是 Chomsky 类型 2 语言,而 RegEx 是类型 3,而类型 2 从根本上比类型 3 更复杂。另请参阅这个关于使用 RegEx 解析 HTML 的著名答案......它本质上是相同的问题。

于 2012-10-03T17:33:00.617 回答