Skip to content

Commit 949bd3b

Browse files
committed
JetBrains#4 Optimize memory usage
- use more memory effective BitSet instead of boolean array - don't create a buffer until we really need it
1 parent 4c942c5 commit 949bd3b

1 file changed

Lines changed: 27 additions & 21 deletions

File tree

jflex/src/main/java/jflex/generator/Emitter.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,9 @@
55

66
package jflex.generator;
77

8-
import java.io.File;
9-
import java.io.PrintWriter;
10-
import java.util.LinkedHashMap;
11-
import java.util.Map;
128
import jflex.base.Build;
139
import jflex.base.Pair;
14-
import jflex.core.AbstractLexScan;
15-
import jflex.core.Action;
16-
import jflex.core.EOFActions;
17-
import jflex.core.LexParse;
18-
import jflex.core.LexScan;
10+
import jflex.core.*;
1911
import jflex.core.unicode.CMapBlock;
2012
import jflex.core.unicode.CharClasses;
2113
import jflex.dfa.DFA;
@@ -26,6 +18,10 @@
2618
import jflex.option.Options;
2719
import jflex.skeleton.Skeleton;
2820

21+
import java.io.File;
22+
import java.io.PrintWriter;
23+
import java.util.*;
24+
2925
/**
3026
* This class manages the actual code generation, putting the scanner together, filling in skeleton
3127
* sections etc.
@@ -175,8 +171,7 @@ private void emitLookBuffer() {
175171
if (!hasGenLookAhead()) return;
176172

177173
println(" /** For the backwards DFA of general lookahead statements */");
178-
println(
179-
" private boolean [] zzFin = new boolean [Math.min(ZZ_BUFFERSIZE, zzMaxBufferLen())+1];");
174+
println(" private BitSet zzFin = null;");
180175
println();
181176
}
182177

@@ -428,11 +423,22 @@ private void emitHeader() {
428423
private void emitUserCode() {
429424
println(scanner.userCode());
430425

426+
List<String> additionalImports = new ArrayList<>();
431427
if (scanner.cup2Compatible()) {
428+
additionalImports.addAll(Arrays.asList(
429+
"/* CUP2 imports */",
430+
"import edu.tum.cup2.scanner.*;",
431+
"import edu.tum.cup2.grammar.*;"
432+
));
433+
}
434+
435+
if (hasGenLookAhead()) {
436+
additionalImports.add("import java.util.BitSet;");
437+
}
438+
439+
if (!additionalImports.isEmpty()) {
432440
println();
433-
println("/* CUP2 imports */");
434-
println("import edu.tum.cup2.scanner.*;");
435-
println("import edu.tum.cup2.grammar.*;");
441+
additionalImports.forEach(this::println);
436442
println();
437443
}
438444
}
@@ -1116,26 +1122,26 @@ private void emitActions() {
11161122
println(" // general lookahead, find correct zzMarkedPos");
11171123
println(" { int zzFState = " + dfa.entryState(action.getEntryState()) + ";");
11181124
println(" int zzFPos = zzStartRead;");
1119-
println(" if (zzFin.length <= zzBufferL.length) {");
1120-
println(" zzFin = new boolean[zzBufferL.length+1];");
1125+
println(" if (zzFin == null || zzFin.size() <= zzBufferL.length) {");
1126+
println(" zzFin = new BitSet(zzBufferL.length+1);");
11211127
println(" }");
1122-
println(" boolean zzFinL[] = zzFin;");
1128+
println(" BitSet zzFinL = zzFin;");
11231129
println(" while (zzFState != -1 && zzFPos < zzMarkedPos) {");
1124-
println(" zzFinL[zzFPos] = ((zzAttrL[zzFState] & 1) == 1);");
1130+
println(" zzFinL.set(zzFPos, ((zzAttrL[zzFState] & 1) == 1));");
11251131
println(" zzInput = Character.codePointAt(zzBufferL, zzFPos, zzMarkedPos);");
11261132
println(" zzFPos += Character.charCount(zzInput);");
11271133
println(" zzFState = zzTransL[ zzRowMapL[zzFState] + zzCMap(zzInput) ];");
11281134
println(" }");
11291135
println(" if (zzFState != -1) {");
1130-
println(" zzFinL[zzFPos++] = ((zzAttrL[zzFState] & 1) == 1);");
1136+
println(" zzFinL.set(zzFPos++, ((zzAttrL[zzFState] & 1) == 1));");
11311137
println(" }");
11321138
println(" while (zzFPos <= zzMarkedPos) {");
1133-
println(" zzFinL[zzFPos++] = false;");
1139+
println(" zzFinL.clear(zzFPos++);");
11341140
println(" }");
11351141
println();
11361142
println(" zzFState = " + dfa.entryState(action.getEntryState() + 1) + ";");
11371143
println(" zzFPos = zzMarkedPos;");
1138-
println(" while (!zzFinL[zzFPos] || (zzAttrL[zzFState] & 1) != 1) {");
1144+
println(" while (!zzFinL.get(zzFPos) || (zzAttrL[zzFState] & 1) != 1) {");
11391145
println(
11401146
" zzInput = Character.codePointBefore(zzBufferL, zzFPos, zzStartRead);");
11411147
println(" zzFPos -= Character.charCount(zzInput);");

0 commit comments

Comments
 (0)