Основной класс Parser
В программной реализации для работы с синтаксическим анализатором представлен класс Parser
, который содержит единственный статический метод process
. Этот метод получает на вход список токенов (объект типа TokenList
), а возвращает построенное дерево разбора (объект типа SyntaxTree
).
class Parser {
public:
Parser() = delete;
Parser(const Parser &) = delete;
Parser(Parser &&) = delete;
~Parser() = delete;
static SyntaxTree process(const TokenList &tokens);
};
Благодаря используемому подходу реализация метода process
довольно проста:
Создается новый (пустой) объект типа SyntaxTree, представляющий выходное дерево, и в качестве корневого в него добавляется узел типа «начало программы».
Создается контекст, в него помещаются: указатель на корневой узел дерева, указатель (итератор) на первый токен в списке, указатель (итератор) на последний токен в списке.
Вызывается парсер
parseProgramRoot
для запуска разбора от начала программы, в который передается созданный контекст. В дальнейшем этот парсер рекурсивно вызывает внутри себя другие парсеры, которые, в свою очередь, также делают рекурсивные вызовы функций, благодаря чему выполняется обход всего списка токенов и построение полного синтаксического дерева.После построения синтаксическое дерево возвращается в качестве выходного значения.