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

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

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);
    }
}
15
задан nbro 3 April 2017 в 14:00
поделиться