secondaryDiagnosis method

void secondaryDiagnosis(
  1. SecondaryRepairInfo repair
)

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;
}