Написание простых парсеров тривиально, и я реализовал несколько за эти годы.В колледже нам тоже пришлось написать один.Но нам никогда не приходилось генерировать значимые результаты, используя этот метод; мы никогда не учились создавать бэкэнд.
Если у меня есть работающий синтаксический анализатор рекурсивного спуска для упрощенного Паскаля и я хочу перевести код на C ++, как бы я поступил?этот?Я не вижу необходимости в промежуточном шаге, таком как создание абстрактного синтаксического дерева.
Итак, как мне вывести вывод скомпилированного или переведенного кода? Единственный полезный пример, который я нашелэто в учебнике Джека Креншоу, но больше внимания уделяется интерфейсу, как и большинству других ресурсов.Связь между моим парсерным кодом и моей грамматикой очень очевидна.Как насчет связи между методами парсера и выводом?Мой метод синтаксического анализа для объявления функции может относиться только к одному вызову EmitLn ( код C ++ здесь ).Но как насчет методов синтаксического анализа, которые не так просты, такие как выражения.Выражения разбиты на, возможно, еще много вызовов, так что намекает на необходимость функции Emit (), которая позволяет разбивать выходной код для выражения по частям. Существует ли какой-либо код котельной пластины для вывода кода, , например, функция EmitLn в книге Джек Креншоу «Давайте создадим компилятор»?Это также показывает, что мне нужно поддерживать базовую таблицу символов, что часто упускается в большинстве примеров.
Я прав?Что еще я должен знать?Какие-либо советы / предложения или ресурсы?Мой большой вопрос в том, что существует так много учебников по внешним интерфейсам компилятора, но как насчет объяснения в конце?Я могу анализировать языки, теперь я хочу развить это, чтобы иметь возможность переводить и компилировать их в другие языки.