![]() |
|
|
![]()
|
|
| Mid1987 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.1.2011 Репутация: нет Всего: нет |
Здравствуйте, Уважаемые форумчане!
Ситуация: В институте задали курсовую написать, транслятор с сильно обрезанного языка Pascal в C. Пишу на C++ Builder XE. Задача в соотвествии с канонами разбита на 3 этапа: 1. Лексический анализатор 2. Синтаксический анализатор 3. Генератор кода выходной программы Первые два этапа успешно реализованы. Выход синтаксического анализатора представляет собой линейную последовательность номеров правил формальной грамматики языка Pascal, выведенных при разборе входной цепочки. Вопрос: Как проще всего (и лучше) реализовать генератор кода в язык C на данных правилах грамматики? Пока поверхостно нашел только вариант перевода с помощью дерева синтаксического разбора в тетрады или триады, а потом из них в выходной язык. Но мне кажется что можно сделать проще. P. S. Заранее спасибо за помощь! |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Mid1987, А вам генерация кода не нужна.
При составлении грамматики. Вы указываете входной алфовит и выходной. Так вот в качестве выходного можно сделать любые выражения. Они сразу и будут генерировать код. В качесте результата выводить не индекс, а строку. Но это будет медленно. Лучше построить дерева синтаксического разбора . А потом обходом в ширину вывести все что нужно. |
|||
|
||||
| Mid1987 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
||||
|
||||
| Mid1987 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.1.2011 Репутация: нет Всего: нет |
Нельзя сопоставить правила грамматик один к одному из - за синтаксиса языков. Там получается 3 варианта:
1. Одно правило сопоставимо с одним правилом (Type -> integer и Type -> int) 2. Одно правило сопоставимо с многими правилами 3. Одно правило не сопоставимо ни с одним правилом Как я писал выше, простые правила грамматик легко заменяются 1 к 1 (типы и т. д.), а вот допустим объявление массива уже так не сделаешь (см. прикрепленный файл). |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Mid1987,
Как раз таки можно. 1) Тут работает. 2) А что мешает расширить набор грамматик? У ваз же она не однозначная. Другое дело что тут может всплыть что-то не хорошее, но это для конкретного языка смотреть надо. 3) Сильно не в давался, но конкретно в вашем случае помоем только with. Его особым случаем обработать. И Array. Вообще насколько я понял из своей практике создание компилятора(транслятора). Это упорство разработчика. Надо тупо перебрать все варианты, а их много. |
|||
|
||||
| Mid1987 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.1.2011 Репутация: нет Всего: нет |
Я думал над этим вариантом. Допустим я напишу грамматику выходного языка и главная проблема встанет увязка правил грамматик друг с другом. Опять же как проще это сделать (то бишь дайте алгоритм
P. S. Действительно Вы правы, в разработке компиляторов (трансляторов) много неформализуемых тонкостей, и поэтому разработка данных инструментов превращается в творчество |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |