Написание парсера для схемы грамматики EBNF - PullRequest
2 голосов
/ 13 января 2020

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

Это правильный подход? И как мне теперь обрабатывать ошибки, так как в принципе любое правило может потерпеть неудачу?

...