primaryDiagnosis method
Implementation
RepairCandidate primaryDiagnosis(PrimaryRepairInfo repair) {
//
// Issue diagnostic.
//
var prevtok = buffer[repair.bufferPosition - 1],
current_token = buffer[repair.bufferPosition];
switch (repair.code) {
case INSERTION_CODE:
case BEFORE_CODE:
{
var name_index = (repair.symbol > NT_OFFSET
? getNtermIndex(stateStack[stateStackTop], repair.symbol,
repair.bufferPosition)
: getTermIndex(stateStack, stateStackTop, repair.symbol,
repair.bufferPosition));
var tok = (repair.code == INSERTION_CODE ? prevtok : current_token);
emitError(repair.code, name_index, tok, tok);
break;
}
case INVALID_CODE:
{
var name_index = getNtermIndex(stateStack[stateStackTop],
repair.symbol, repair.bufferPosition + 1);
emitError(repair.code, name_index, current_token, current_token);
break;
}
case SUBSTITUTION_CODE:
{
int name_index;
if (repair.misspellIndex >= 6) {
name_index = terminalIndex(repair.symbol);
} else {
name_index = getTermIndex(stateStack, stateStackTop, repair.symbol,
repair.bufferPosition + 1);
if (name_index != terminalIndex(repair.symbol)) {
repair.code = INVALID_CODE;
}
}
emitError(repair.code, name_index, current_token, current_token);
break;
}
case MERGE_CODE:
emitError(repair.code, terminalIndex(repair.symbol), current_token,
tokStream.getNext(current_token));
break;
case SCOPE_CODE:
{
for (var i = 0; i < scopeStackTop; i++) {
emitError(
repair.code,
-scopeIndex[i],
locationStack[scopePosition[i]],
prevtok,
nonterminalIndex(scopeLhs(scopeIndex[i])));
}
repair.symbol = scopeLhs(scopeIndex[scopeStackTop]) + NT_OFFSET;
stateStackTop = scopePosition[scopeStackTop];
emitError(
repair.code,
-scopeIndex[scopeStackTop],
locationStack[scopePosition[scopeStackTop]],
prevtok,
getNtermIndex(stateStack[stateStackTop], repair.symbol,
repair.bufferPosition));
break;
}
default: // deletion
emitError(repair.code, terminalIndex(ERROR_SYMBOL), current_token,
current_token);
}
//
// Update buffer.
//
var candidate = RepairCandidate();
switch (repair.code) {
case INSERTION_CODE:
case BEFORE_CODE:
case SCOPE_CODE:
candidate.symbol = repair.symbol;
candidate.location = buffer[repair.bufferPosition];
tokStream.reset(buffer[repair.bufferPosition]);
break;
case INVALID_CODE:
case SUBSTITUTION_CODE:
candidate.symbol = repair.symbol;
candidate.location = buffer[repair.bufferPosition];
tokStream.reset(buffer[repair.bufferPosition + 1]);
break;
case MERGE_CODE:
candidate.symbol = repair.symbol;
candidate.location = buffer[repair.bufferPosition];
tokStream.reset(buffer[repair.bufferPosition + 2]);
break;
default: // deletion
candidate.location = buffer[repair.bufferPosition + 1];
candidate.symbol = tokStream.getKind(buffer[repair.bufferPosition + 1]);
tokStream.reset(buffer[repair.bufferPosition + 2]);
break;
}
return candidate;
}