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