Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Алгоритм генерации кода в трансляторе с языка Pascal в C

63K
19 января 2011 года
Mid1987
3 / / 21.09.2010
Здравствуйте, Уважаемые форумчане!

Ситуация:
В институте задали курсовую написать, транслятор с сильно обрезанного языка Pascal в C.
Пишу на C++ Builder XE. Задача в соотвествии с канонами разбита на 3 этапа:
1. Лексический анализатор
2. Синтаксический анализатор
3. Генератор кода выходной программы
Первые два этапа успешно реализованы. Выход синтаксического анализатора представляет собой линейную последовательность номеров правил формальной грамматики языка Pascal, выведенных при разборе входной цепочки.

Вопрос:
Как проще всего (и лучше) реализовать генератор кода в язык C на данных правилах грамматики? Пока поверхостно нашел только вариант перевода с помощью дерева синтаксического разбора в тетрады или триады, а потом из них в выходной язык. Но мне кажется что можно сделать проще.

P. S. Заранее спасибо за помощь!
412
20 января 2011 года
grgdvo
323 / / 04.07.2007
Синтаксически языки отличаются... взять те же функции или процедуры... Вы уверены, что у вас правила грамматики подходят сразу для двух языков?
63K
21 января 2011 года
Mid1987
3 / / 21.09.2010
В том то и дело что не подходят, нельзя сопоставить правила грамматик один к одному из - за синтаксиса языков. Там получается 3 варианта:

1. Одно правило сопоставимо с одним правилом (Type -> integer и Type -> int)
2. Одно правило сопоставимо с многими правилами
3. Одно правило не сопоставимо ни с одним правилом

простые правила грамматик легко заменяются 1 к 1 (типы и т. д.), а вот допустим объявление массива уже так не сделаешь.
5
21 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Mid1987

Пишу на C++ Builder XE. Задача в соотвествии с канонами разбита на 3 этапа:
1. Лексический анализатор
2. Синтаксический анализатор
3. Генератор кода выходной программы


Каноны - фуфло. :) Говорю вам как автор транслятора C# 4.0 -> Nemerle 1.0.

Цитата: Mid1987
Выход синтаксического анализатора представляет собой линейную последовательность номеров правил формальной грамматики языка Pascal, выведенных при разборе входной цепочки.

Выход неверный. Вам необходимо генерировать синтаксическое дерево (AST) языка Pascal. В синтаксическое дерево входит буквально все что удалось разобрать из исходного файла: объявления типов, их структура, функуции, переменные, все выражения. В сложных случаях в дереве могут содержаться комментарии и разобранные ключевые слова и прчие синтаксические мелочи, вроде скобок и запятых, необходимые для реализации автоподстановки в IDE.

Никакие триады-тетрады (суть - опкоды) не нужны. Вам нужно преобразовать синтаксическое дерево Pascal в синтаксическое дерево С, затем последнее просто преобразовать в строку - т.е. записать в файл.

63K
23 января 2011 года
Mid1987
3 / / 21.09.2010
hardcase спасибо за ответ!
Сгенерировать синтаксическое дерево вместо последовательности индексов правил грамматики не проблема. Можете более точно описать процесс преобразования дерева разбора Pascal в дерево C? Буду премного благодарен :)
5
23 января 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: Mid1987
Можете более точно описать процесс преобразования дерева разбора Pascal в дерево C? Буду премного благодарен :)


Процесс достаточно прост - нужно обойти вглубь (слева направо) дерево разбора Pascal, возможно "протащить" кое-какую контекстную информацию и построить (снизу-вверх) дерево разбора Си. В принципе, в случае небольшого подмножества Pascal можно генерировать текст а C на лету.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог