Реализация парсера рекурсивного спуска
Я ищу написать псевдокод парсера рекурсивного спуска. Сейчас у меня нет опыта с этим типом кодирования. Я прочитал несколько примеров в Интернете, но они работают только с грамматикой, которая использует математические выражения. Вот грамматика, на которой я основываю парсер.
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);
}
}