parseEntry method
Object?
parseEntry(
[ - int marker_kind = 0,
- int max_error_count = 0
])
Implementation
Object? parseEntry([int marker_kind = 0, int max_error_count = 0]) {
action.reset();
tokStream.reset(); // Position at first token.
reallocateStateStack();
stateStackTop = 0;
stateStack[0] = START_STATE;
skipTokens = max_error_count < 0;
if (max_error_count > 0 && tokStream is IPrsStream) max_error_count = 0;
//
// The tuple tokens will eventually contain the sequence
// of tokens that resulted in a successful parse. We leave
// it up to the "Stream" implementer to define the predecessor
// of the first token as he sees fit.
//
tokens = IntTuple(tokStream.getStreamLength());
tokens.add(tokStream.getPrevious(tokStream.peek()));
var start_token_index = tokStream.peek(),
repair_token = getMarkerToken(marker_kind, start_token_index),
start_action_index = action.size(); // obviously 0
var temp_stack = List.filled(stateStackTop + 1, 0);
ArrayList.copy(stateStack, 0, temp_stack, 0, temp_stack.length);
var initial_error_token = backtrackParseInternal(action, repair_token);
for (var error_token = initial_error_token, count = 0;
error_token != 0;
error_token = backtrackParseInternal(action, repair_token), count++) {
if (count == max_error_count) {
throw BadParseException(initial_error_token);
}
action.reset(start_action_index);
tokStream.reset(start_token_index);
stateStackTop = temp_stack.length - 1;
ArrayList.copy(temp_stack, 0, stateStack, 0, temp_stack.length);
reallocateOtherStacks(start_token_index);
backtrackParseUpToError(repair_token, error_token);
for (stateStackTop = findRecoveryStateIndex(stateStackTop);
stateStackTop >= 0;
stateStackTop = findRecoveryStateIndex(stateStackTop - 1)) {
var recovery_token = tokens.get(locationStack[stateStackTop] - 1);
repair_token = errorRepair(
tokStream as IPrsStream,
(recovery_token >= start_token_index
? recovery_token
: error_token),
error_token);
if (repair_token != 0) break;
}
if (stateStackTop < 0) throw BadParseException(initial_error_token);
temp_stack = List.filled(stateStackTop + 1, 0);
ArrayList.copy(stateStack, 0, temp_stack, 0, temp_stack.length);
start_action_index = action.size();
start_token_index = tokStream.peek();
}
if (repair_token != 0) tokens.add(repair_token);
int t;
for (t = start_token_index;
tokStream.getKind(t) != EOFT_SYMBOL;
t = tokStream.getNext(t)) {
tokens.add(t);
}
tokens.add(t);
return parseActions(marker_kind);
}