Mir unerklärlicher StackOveflow bei RegExp-Verarbeitung

Status
Nicht offen für weitere Antworten.

larissa86

Mitglied
Hallo!

Ich arbeite gerade an einem Programm, dass Quelltext einer anderen Sprache parsen soll. Ziel ist es, unbenutzte Funktionen zu entfernen.

Dazu scanne ich mit folgenden Pattern nach Funktionsdefinitionen (1) und -aufrufen (2):
(1): Func[ \\t]+([A-Za-z0-9_]+).*?EndFunc
(2): [\\+\\-\\*/\\(\\[\\n\\t ]{1}([A-Za-z0-9_]++)[\\t ]*?\\(

Etwas mehr Source für euch:
Code:
public static StringBuilder removeUnusedFuncs(StringBuilder datei) {
        ArrayList<String> funcNames = new ArrayList<String>();
        Hashtable<String, Integer> usedFuncs = new Hashtable<String, Integer>();
        ArrayList<Integer> starts = new ArrayList<Integer>();
        ArrayList<Integer> ends = new ArrayList<Integer>();

         Pattern p = Pattern.compile("Func[ \\t]+([A-Za-z0-9_]+).*?EndFunc", Pattern.CASE_INSENSITIVE + Pattern.DOTALL);
        Matcher m = p.matcher(datei);

        while (m.find()) {
            funcNames.add(m.group(1).toLowerCase());
            starts.add(m.start(0));
            ends.add(m.end(0));
        }

        p = Pattern.compile("[\\+\\-\\*/\\(\\[\\n\\t ]{1}([A-Za-z0-9_]++)[\\t ]*?\\(");
        m = p.matcher(datei);
        String vFunc;
        while (m.find()) {
            vFunc = m.group(1).toLowerCase();
            if (usedFuncs.containsKey(vFunc)) {
                usedFuncs.put(vFunc, usedFuncs.get(vFunc) + 1);
            } else {
                usedFuncs.put(vFunc, 1);
            }
        }
        p = null;
        m = null;

        // vergleichen
        for (int i = funcNames.size() - 1; i >= 0; i--) {
            System.out.println(funcNames.get(i) + "  " + usedFuncs.get(funcNames.get(i)));
            if (!usedFuncs.containsKey(funcNames.get(i)) || usedFuncs.get(funcNames.get(i)) < 2) {
                datei.delete(starts.get(i), ends.get(i));
            }
        }

        return datei;
    }

Was nun passiert, ist folgendes: Ab einer gewissen Dateigröße bekomme ich diesen Fehler:
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3789)
at java.util.regex.Pattern$Curly.match(Pattern.java:3744)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3366)
[usw.]

Leider kriege ich keine Information darüber, wo der Fehler seinen Ursprung hat (der gesamte Trace ist aus der Pattern-Class). Ich sehe auch keine Gruppe, die sich totlaufen könnte o.ä. Irritierenderweise gibt es keinen Fehler, wenn ich die Zeile
datei.delete(starts.get(i), ends.get(i));
auskommentiere.

Ich bin am Ende mit meinem Latein, kann jemand helfen?

Danke,
Larissa
 
B

Beni

Gast
Kannst du mal eine Datei hochladen (siehe Knöpfchen "Eigene Dateien" oben rechts), damit man das ausprobieren kann?

[Edit: bei dem Eclipse-Debugger, und sicherlich auch bei anderen, kann man einen Breakpoint setzen der auf Exceptions anspringt (Breakpoint-View, der Knopf ganz rechts), kannst mal versuchen so zum Fehler zu springen]
 

larissa86

Mitglied
Aber klar ;)

Siehe Anhang :)

Außerdem noch eine Funktion für Datei -> StringBuilder:
Code:
public static StringBuilder readFileToString(File file) {
        BufferedReader br = null;
        StringBuilder s = new StringBuilder("\n");

        try {
            if (file == null) {
                return s;
            }
            br = new BufferedReader(new FileReader(file));
            String line;

            while ((line = br.readLine()) != null) {
                s.append(line + "\n");
            }
            br.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ScriptCleaner.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ScriptCleaner.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                br.close();
            } catch (IOException ex) {
                Logger.getLogger(ScriptCleaner.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return s;
    }

Danke schon mal :)

Larissa

p.s. nutze im Moment NetBeans, habe aber auch Eclipse hier...


http://www.java-forum.org/de/userfiles/user11471/testskript.au3
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben