Implementação do analisador de descida recursiva

Estou procurando escrever um pseudo-código de um analisador de descida recursiva. Agora, não tenho experiência com esse tipo de codificação. Eu li alguns exemplos online, mas eles só funcionam com gramática que usa expressões matemáticas. Aqui está a gramática na qual estou baseando o analisado

S -> if E then S | if E then S else S | begin S L | print E

L -> end | ; S L

E -> i

Eu devo escrever métodosS(), L() eE() e retorne algumas mensagens de erro, mas os tutoriais que encontrei on-line não ajudaram muito. Alguém pode me apontar na direção certa e me dar alguns exemplos?.

Gostaria de escrevê-lo em sintaxe C # ou Java, pois é mais fácil para eu me relaciona

Atualiza
public void S() {
    if (currentToken == "if") {
        getNextToken();
        E();

        if (currentToken == "then") {
            getNextToken();
            S();

            if (currentToken == "else") {
                getNextToken();
                S();
                Return;
            }
        } else {
            throw new IllegalTokenException("Procedure S() expected a 'then' token " + "but received: " + currentToken);
        } else if (currentToken == "begin") {
            getNextToken();
            S();
            L();
            return;
        } else if (currentToken == "print") {
            getNextToken();
            E();
            return;
        } else {
            throw new IllegalTokenException("Procedure S() expected an 'if' or 'then' or else or begin or print  token " + "but received: " + currentToken);
        }
    }
}


public void L() {
    if (currentToken == "end") {
        getNextToken();
        return;
    } else if (currentToken == ";") {
        getNextToken();
        S();
        L();
        return;
    } else {
        throw new IllegalTokenException("Procedure L() expected an 'end' or ';' token " + "but received: " + currentToken);
    }
}


public void E() {
    if (currentToken == "i") {
        getNextToken();
        return;
    } else {
        throw new IllegalTokenException("Procedure E() expected an 'i' token " + "but received: " + currentToken);
    }
}

questionAnswers(6)

yourAnswerToTheQuestion