Алгоритм генерации кода в трансляторе с языка Pascal в C
Ситуация:
В институте задали курсовую написать, транслятор с сильно обрезанного языка Pascal в C.
Пишу на C++ Builder XE. Задача в соотвествии с канонами разбита на 3 этапа:
1. Лексический анализатор
2. Синтаксический анализатор
3. Генератор кода выходной программы
Первые два этапа успешно реализованы. Выход синтаксического анализатора представляет собой линейную последовательность номеров правил формальной грамматики языка Pascal, выведенных при разборе входной цепочки.
Вопрос:
Как проще всего (и лучше) реализовать генератор кода в язык C на данных правилах грамматики? Пока поверхостно нашел только вариант перевода с помощью дерева синтаксического разбора в тетрады или триады, а потом из них в выходной язык. Но мне кажется что можно сделать проще.
P. S. Заранее спасибо за помощь!
1. Одно правило сопоставимо с одним правилом (Type -> integer и Type -> int)
2. Одно правило сопоставимо с многими правилами
3. Одно правило не сопоставимо ни с одним правилом
простые правила грамматик легко заменяются 1 к 1 (типы и т. д.), а вот допустим объявление массива уже так не сделаешь.
Пишу на C++ Builder XE. Задача в соотвествии с канонами разбита на 3 этапа:
1. Лексический анализатор
2. Синтаксический анализатор
3. Генератор кода выходной программы
Каноны - фуфло. :) Говорю вам как автор транслятора C# 4.0 -> Nemerle 1.0.
Выход неверный. Вам необходимо генерировать синтаксическое дерево (AST) языка Pascal. В синтаксическое дерево входит буквально все что удалось разобрать из исходного файла: объявления типов, их структура, функуции, переменные, все выражения. В сложных случаях в дереве могут содержаться комментарии и разобранные ключевые слова и прчие синтаксические мелочи, вроде скобок и запятых, необходимые для реализации автоподстановки в IDE.
Никакие триады-тетрады (суть - опкоды) не нужны. Вам нужно преобразовать синтаксическое дерево Pascal в синтаксическое дерево С, затем последнее просто преобразовать в строку - т.е. записать в файл.
Сгенерировать синтаксическое дерево вместо последовательности индексов правил грамматики не проблема. Можете более точно описать процесс преобразования дерева разбора Pascal в дерево C? Буду премного благодарен :)
Процесс достаточно прост - нужно обойти вглубь (слева направо) дерево разбора Pascal, возможно "протащить" кое-какую контекстную информацию и построить (снизу-вверх) дерево разбора Си. В принципе, в случае небольшого подмножества Pascal можно генерировать текст а C на лету.