Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм генерации кода в трансляторе с языка Pasc, Создание генератора кода для транслятора 
:(
    Опции темы
Mid1987
Дата 19.1.2011, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.1.2011

Репутация: нет
Всего: нет



Здравствуйте, Уважаемые форумчане! 

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

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

P. S. Заранее спасибо за помощь!
PM MAIL   Вверх
Pavia
Дата 20.1.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Mid1987,  А вам генерация кода не нужна.
При составлении грамматики.  Вы указываете входной алфовит и выходной. Так вот в качестве выходного можно сделать любые выражения.
Они сразу и будут генерировать код.
В качесте результата выводить не индекс, а строку.

Но это будет медленно. Лучше построить дерева синтаксического разбора . А потом обходом в ширину вывести все что нужно.
PM MAIL   Вверх
Mid1987
Дата 20.1.2011, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.1.2011

Репутация: нет
Всего: нет



Спасибо за ответ Pavia.
Я попросил бы Вас уточнить. Я прикрепил свою грамматику входного языка в файле. Так вот, как я Вас понимаю мне надо написать ещё грамматику выходного языка и сопоставить индексы обеих грамматик друг другу, и при выводе естественно использовать выходную грамматику? Если да, то такой вариант не сработает :(

UPD:
Или Вы имеете ввиду следующее:
у меня есть алфавит нетерминальных символов и есть алфавит терминальных символов входного языка. В выходном языке алфавит нетерминальных символов остаётся таким же, а в алфавите терминальных символов делаем прямую замену операторных скобок ("begin" и "end" на "{" и "}"), типов переменных (integer на int, extended на double), логических операций (and на &&, or на ||) и т. д. А как же реализовать тогда сложные структуры if, case, for, объявления массива?

Это сообщение отредактировал(а) Mid1987 - 20.1.2011, 01:36

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  ___________________2_.doc 41,00 Kb
PM MAIL   Вверх
Pavia
Дата 20.1.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Цитата(Mid1987 @  20.1.2011,  01:17 Найти цитируемый пост)
 выходную грамматику? Если да, то такой вариант не сработает :(

Да, я имел виду так. почему не сработает?
PM MAIL   Вверх
Mid1987
Дата 21.1.2011, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.1.2011

Репутация: нет
Всего: нет



Нельзя сопоставить правила грамматик один к одному из - за синтаксиса языков. Там получается 3 варианта:
1. Одно правило сопоставимо с одним правилом (Type -> integer и Type -> int)
2. Одно правило сопоставимо с многими правилами
3. Одно правило не сопоставимо ни с одним правилом

Как я писал выше, простые правила грамматик легко заменяются 1 к 1 (типы и т. д.), а вот допустим объявление массива уже так не сделаешь (см. прикрепленный файл).
PM MAIL   Вверх
Pavia
Дата 21.1.2011, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



Mid1987, 
Как раз таки можно.
1) Тут работает.
2) А что мешает расширить набор грамматик? У ваз же она не однозначная. Другое дело что тут может всплыть что-то не хорошее, но это для конкретного языка смотреть надо.
3) Сильно не в давался, но конкретно в вашем случае помоем только with. Его особым случаем обработать. И Array.


Вообще насколько я понял из своей практике создание компилятора(транслятора).  Это упорство разработчика. Надо тупо перебрать все варианты, а их много.
PM MAIL   Вверх
Mid1987
Дата 23.1.2011, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.1.2011

Репутация: нет
Всего: нет



Я думал над этим вариантом. Допустим я напишу грамматику выходного языка и главная проблема встанет увязка правил грамматик друг с другом. Опять же как проще это сделать (то бишь дайте алгоритм  smile ). Просто я ещё думал всплывут варианты на форуме.

P. S. Действительно Вы правы, в разработке компиляторов (трансляторов) много неформализуемых тонкостей, и поэтому разработка данных инструментов превращается в творчество  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.