Реализация парсера рекурсивного спуска

Я ищу написать псевдокод парсера рекурсивного спуска. Сейчас у меня нет опыта с этим типом кодирования. Я прочитал несколько примеров в Интернете, но они работают только с грамматикой, которая использует математические выражения. Вот грамматика, на которой я основываю парсер.

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

L -> end | ; S L

E -> i

Я должен написать методыS(), L() а такжеE() и вернуть некоторые сообщения об ошибках, но учебники, которые я нашел в Интернете, не очень помогли. Может ли кто-нибудь указать мне правильное направление и привести несколько примеров?

Я хотел бы написать это в C # или синтаксисе Java, так как мне легче общаться.

Обновить
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);
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос