secondaryDiagnosis method
Implementation
void secondaryDiagnosis(SecondaryRepairInfo repair) {
switch (repair.code) {
case SCOPE_CODE:
{
if (repair.stackPosition < stateStackTop) {
emitError(DELETION_CODE, terminalIndex(ERROR_SYMBOL),
locationStack[repair.stackPosition], buffer[1]);
}
for (var i = 0; i < scopeStackTop; i++) {
emitError(
SCOPE_CODE,
-scopeIndex[i],
locationStack[scopePosition[i]],
buffer[1],
nonterminalIndex(scopeLhs(scopeIndex[i])));
}
repair.symbol = scopeLhs(scopeIndex[scopeStackTop]) + NT_OFFSET;
stateStackTop = scopePosition[scopeStackTop];
emitError(
SCOPE_CODE,
-scopeIndex[scopeStackTop],
locationStack[scopePosition[scopeStackTop]],
buffer[1],
getNtermIndex(stateStack[stateStackTop], repair.symbol,
repair.bufferPosition));
break;
}
default:
emitError(
repair.code,
(repair.code == SECONDARY_CODE
? getNtermIndex(stateStack[repair.stackPosition], repair.symbol,
repair.bufferPosition)
: terminalIndex(ERROR_SYMBOL)),
locationStack[repair.stackPosition],
buffer[repair.bufferPosition - 1]);
stateStackTop = repair.stackPosition;
}
return;
}