blob: a99ec136eb616d2f6ec7d7a5b9f58d47d588febd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.lpgextensions;
import java.util.LinkedList;
import lpg.lpgjavaruntime.ConfigurationStack;
import lpg.lpgjavaruntime.IntTuple;
import lpg.lpgjavaruntime.TokenStream;
class ParserState {
private static final int STACK_INCREMENT = 1024;
public int lastToken;
public int currentAction;
public IntTuple tokens;
public int actionStack[];
public int stateStackTop;
public int[] stateStack;
public int actionCount;
public int totalCommits;
public int[] parserLocationStack;
public int[] undoStack;
// Error recovery
public int[] locationStack;
public int repair_token;
/**
* The number of trial actions that have been executed since the last backtrackable point was encountered.
*/
public int trialActionCount;
/**
* A stack that contains the number of trial actions that were executed at different backtrackable points.
*/
public LinkedList<Integer> trialActionStack;
/**
* Trial actions that have been executed but not yet committed.
*/
@SuppressWarnings("rawtypes")
public LinkedList pendingCommits;
public ConfigurationStack configurationStack;
public int act;
public int curtok;
public ParserState(int startState, TokenStream tokStream) {
reallocateStateStack();
stateStackTop = 0;
stateStack[0] = startState;
//
// 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.
//
tokStream.reset(); // Position at first token.
tokens = new IntTuple(tokStream.getStreamLength());
tokens.add(tokStream.getPrevious(tokStream.peek()));
}
public void allocateOtherStacks() {
locationStack = new int[stateStack.length];
}
public void reallocateStateStack() {
int old_stack_length = (stateStack == null ? 0 : stateStack.length),
stack_length = old_stack_length + STACK_INCREMENT;
if (stateStack == null)
stateStack = new int[stack_length];
else
System.arraycopy(stateStack, 0, stateStack = new int[stack_length], 0, old_stack_length);
return;
}
//
// Allocate or reallocate all the stacks. Their sizes should always be the
// same.
//
public void reallocateOtherStacks(int start_token_index) {
// assert(stateStack != null);
if (this.actionStack == null) {
this.actionStack = new int[stateStack.length];
locationStack = new int[stateStack.length];
actionStack[0] = 0;
undoStack = new int[stateStack.length];
locationStack[0] = start_token_index;
parserLocationStack = new int[stateStack.length];
parserLocationStack[0] = start_token_index;
} else if (this.actionStack.length < stateStack.length) {
int old_length = this.actionStack.length;
System.arraycopy(this.actionStack, 0, this.actionStack = new int[stateStack.length], 0, old_length);
System.arraycopy(this.undoStack, 0, this.undoStack = new int[stateStack.length], 0, old_length);
System.arraycopy(locationStack, 0, locationStack = new int[stateStack.length], 0, old_length);
}
return;
}
@SuppressWarnings("nls")
public void dumpState() {
System.out.print(curtok);
System.out.print("\t");
System.out.print(act);
System.out.print("\t");
dump(stateStack, stateStackTop);
System.out.print("\t");
dump(parserLocationStack, stateStackTop);
System.out.println();
}
@SuppressWarnings("nls")
private void dump(int[] array, int limit) {
System.out.print("[");
for (int i = 0; i < limit; i++) {
if (i > 0) {
System.out.print(", ");
}
System.out.print(array[i]);
}
System.out.print("]");
}
}