Анализатор рукописного ввода LALR (1) для навигации по таблице

#c #parsing #interpreter

#c #синтаксический анализ #интерпретатор

Вопрос:

в образовательных целях (после курса официальных языков) мы с другом хотели написать упрощенный интерпретатор, подобный c, вручную (не используя bison amp; friends).

Мы почти все сделали: токенизатор и классы ast все уже реализованы, и мы создали таблицу синтаксического анализа LALR (1) для нашей грамматики и сравнили ее с таблицей синтаксического анализа, сгенерированной этим веб-сайтом, просто чтобы дважды проверить правильность.

Но теперь мы немного заблудились; как на самом деле написать код, который эффективно перемещается по таблице LALR, распределяя классы ast в reduce? Существует ли эффективный или «стандартный» способ реализации навигации по таблице lalr? Просматривая Онлайн, мы продолжаем находить только вопросы и примеры о том, как построить таблицу, но буквально ничего о том, как перемещаться по ней.

Комментарии:

1. операции shfit / reduce в значительной степени объясняют сами себя. При переносе вы переносите данные из входных данных в стек синтаксического анализа, а при уменьшении вы удаляете данные из стека (отказ от ответственности: это воспоминания из моего курса компиляции)

2. я знаю, что означают shift и reduce, чего я не знаю, так это как на самом деле перемещаться по таблице @bartop; как эффективно управлять стеком, беря следующий токен, просматривая таблицу; это скорее вопрос о том, как структурировать код.

3. это довольно расплывчатые вопросы. Я думаю, вам следует подумать о том, чтобы сделать их более конкретными, потому что то, о чем вы просите, — это широкая область ответов, основанных на мнениях

4. Что вы подразумеваете под «навигацией»? Концептуально таблица представляет собой простой двумерный массив, поэтому вы просто индексируете ее текущим состоянием и исходным номером токена. Затем вы делаете все, что указано: сдвигаете токен, выполняете действие уменьшения, сигнализируете об ошибке. Повторяйте до завершения. Вы спрашиваете о сжатии таблицы? Или что?