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:
Was nun passiert, ist folgendes: Ab einer gewissen Dateigröße bekomme ich diesen Fehler:
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
Ich bin am Ende mit meinem Latein, kann jemand helfen?
Danke,
Larissa
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
auskommentiere.datei.delete(starts.get(i), ends.get(i));
Ich bin am Ende mit meinem Latein, kann jemand helfen?
Danke,
Larissa