Ok.

Fare un pila da zero non è difficile, si tratta di incapsulare un array e un indice che indica l'elemento in cima alla pila.

Una bozza (molto incompleta) può essere la seguente:

codice:
public class PilaDiStringhe {
    private String[] dati = new String[100]; // da far crescere all'occorrenza
    private int ultimoIndice = -1;

    public void push(String nuova) {
        // TODO gestire ridimensionamento
       
        dati[ultimoIndice++] = nuova; 
    }

    public String pop() {
        return dati[ultimoIndice--];
    }
}
Per quanto riguarda la grammatica... Questa è fissata? Perché mi pare che scrivere un parser per una generica grammatica non è proprio banale