В настоящее время я пишу свой собственный компилятор для подмножества схем, и у меня есть проблемы с моим собственным анализатором рекурсивного спуска для грамматики. Я использую грамматику схемы Chez, найденную здесь: https://www.scheme.com/tspl2d/grammar.html. Проблемы приходят от звездочек и плюсов. Поскольку звездочки в основном означают правила epsilon, мне нужно либо проверить, является ли следующий токен допустимым, либо позволить вызываемому нетерминальному методу завершиться с ошибкой и ничего не вернуть. Я выбрал второй подход и использовал вектор для сохранения токенов, которые, возможно, необходимо восстановить.
Пример:
Примечание: код для построения AST по-прежнему отсутствует
bool Parser::definition() {
if (variableDefinition()){
consumeTT(); // consumeTemporaryTokens
return true;
}
if (derivedDefinition()){
consumeTT();
return true;
}
if (checkNext(Tag::LPAR)) {
if (checkNext(Tag::BEGIN)) {
while (definition())
;
consumeTT();
return true;
}
}
restoreTT(); //restoreTemporaryTokens
return false;
}
Это правильный подход? И как мне теперь обрабатывать ошибки, так как в принципе любое правило может потерпеть неудачу?