Skip to content

Instantly share code, notes, and snippets.

@andreyvit
Created March 23, 2009 12:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andreyvit/83526 to your computer and use it in GitHub Desktop.
Save andreyvit/83526 to your computer and use it in GitHub Desktop.
private void calculateSymbolOffsets() {
int start = 0;
int lastPercent = 0;
for (int i = 0; i < symbols.size(); i++) {
// int pc = (int) (100.0 * i / symbols.size());
// if (pc != lastPercent) {
// System.out.println("Calculating offsets: " + pc + "% done");
// lastPercent = pc;
// }
DtlSymbol symbol = symbols.get(i);
String token = symbol.toSourceString().toLowerCase();
if (token.length() == 0 && i > 0 && symbols.get(i - 1).hasOffset()) {
int end = symbols.get(i - 1).end();
symbol.assignOffsets(end, end);
continue;
}
// crazy fix START
int limitingTopOffset = findLimitingTopOffset(symbol);
for (int j = skippedAreas.size() - 1; j >= 0; j--) {
Range range = skippedAreas.get(j);
if (range.end <= limitingTopOffset)
break;
if (token.length() > range.length())
continue;
if (range.length() < 75 /* throw in some magic constants */)
continue;
int possibleFixedStart = Math.max(limitingTopOffset, range.start);
int fixedTokenStart = lowercaseSource.indexOf(token, possibleFixedStart);
if (fixedTokenStart >= 0) {
int fixedTokenEnd = fixedTokenStart + token.length();
if (fixedTokenEnd < range.end) {
// crazy fix CULMINATION
symbol.assignOffsets(fixedTokenStart, fixedTokenEnd);
for (int k = i - 1; k >= 0; k--) {
DtlSymbol sym = symbols.get(k);
if (!sym.hasOffset())
continue;
if (sym.start() >= fixedTokenStart) {
System.out.println("Removing offset of " + sym + " because of " + symbol);
sym.removeOffsets();
}
}
skippedAreas.remove(j);
int jj = j;
if (fixedTokenStart > range.start) {
skippedAreas.add(j, new Range(range.start, fixedTokenStart));
jj = j + 1;
}
if (fixedTokenEnd < range.end)
skippedAreas.add(jj, new Range(fixedTokenEnd, range.end));
break;
}
}
}
// crazy fix END
if (!symbol.hasOffset()) {
int tokenStart = lowercaseSource.indexOf(token, start);
if (tokenStart >= 0) {
if (tokenStart - start >= 2)
skippedAreas.add(new Range(start, tokenStart));
int tokenEnd = tokenStart + token.length();
symbol.assignOffsets(tokenStart, tokenEnd);
start = tokenEnd;
}
}
// crazy fix START
if (symbol.hasOffset())
currentOffsets.put(parents.get(symbol), symbol.end());
// crazy fix END
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment