Помощь - Поиск - Пользователи - Календарь
Полная версия: Конвертация кодов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Провинциалка
Здравствуйте! Очень нуждаюсь в помощи настоящих знатоков языков программирования Delphi и C++.
Дело в том что я должна решить задачу по следующей теме: Конвертирование программ с одного языка программирования на другой Delphi < > C++

Я её понимаю так что нужно написать программу, конвертирующую код с одного языка программирования на другой, а именно с Delphi на C++. А как это сделать, ума не приложу. Просмотрела здесь массу похожих тем, ничего толкового не нашла. Не знаю даже от чего оттолкнуться.
Подскажите хорошую идею
IUnknown
Самая хорошая идея - посмотреть, как это делает утилита PtoC, чтоб было от чего отталкиваться. Заодно почитать здесь: Readme
Провинциалка
Не судите меня строго, но боюсь, что мне сложно будет разобраться в этом море информации. Особенно если учесть, что google перевел страницу на русский так как будто её писал русскоговорящий китаец. Если не трудно, объясните как работает ptoc354

Добавлено через 5 мин.
Пойду спать, завтра с новыми силами начну усиленно вдумываться в материал
Lapp
Цитата(Провинциалка @ 9.12.2011 1:11) *
Не судите меня строго

Оля, с чего ты взяла, что кто-то вообще судит?.. smile.gif Я, например, как всегда, очень рад человеку, который работатет сам.

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

Я рекомендую начать с того, что просто сопоставить эти языки. Грубо говоря, есть три части.
1. Что есть и там, и там (скажем, оператор присваивания).
2. То, что есть только в Си и нет в Паскале (например, значение оператора присваивания).
3. То, чего нет в Си, но есть в Паскале (например, with).
Все это аккуратно выписать в две (на самом деле больше) колонки и пронумеровать, а также попытаться расположить в порядке возрастания сложности. А потом начинать осуществлять по пунктам..

А кроме того, тебе волей-неволей придется сделать часть работы компилятора (анализировать структуру программы). Это тоже надо попытаться обдумать.

Короче, я что хочу сказать? Что тут полно работы ДО программирования. Начни с того, что возьми несложный код и попытайся его перевести вручную..

Да, и еще один вопросик к тебе - сама прога-то на каком языке будет? на Дельфи, судя пр разделу, который ты выбрала? Надеюсь, ты не собираешься ее по ходу дела конвертировать туда обратно как подопытного кролика.. smile.gif
Провинциалка
Спасибо!
Отвечу по порядку:
1.
Цитата
Обратная же задача.. Она тоже разрешима, но пота и крови придется пролить поболе

Если имеется ввиду конвертация не с Delphi на С++ , а с С++ на Delphi - то здесь однозначно Delphi на С++.
Если же речь идет о том, что программа должна уметь делать и то и другое - тут скажу что это лишнее.
2.
Цитата
если, конечно, замахиваться на полную функциональность

Учитель посоветовал сделать программку, переводящую не слишком сложный код!
3.
Цитата
сама прога-то на каком языке будет?
- это на усмотрение, но мне почему-то кажется что легче на Delphi/
IUnknown
Что-то темка приутихла...

Провинциалка, если бы передо мной стояла задача написать программу, конвертирующую исходник с Дельфи (будем говорить, с Паскаля) на С++, то я бы поступил так: пишется парсер, который перегоняет исходник программы в некий список инструкций. Скажем, фрагмент
x := x + 5;
y := f(x);
записывался бы так:
(instr:insAssign; src:(ссылка1); dest:(ссылка2); next:(instr:insAssign; src:(ссылка3); dest:(ссылка4); next:NIL); next:NIL)
, где ссылка1 - это адрес того элемента списка переменных, который содержит описание переменной X, то же самое - для переменной Y ее адрес хранит ссылка3. Или адрес переменной-структуры с указанием имени поля. Это все надо продумать...
А ссылка2 и ссылка4 - это деревья, которые и хранят само выражение. Тоже в таком же виде, не имена переменных, а ссылки на их описания...

Точно в таком же стиле можно описывать любые конструкции языка, будь то подпрограммы (тогда вместо src/dest придется хранить имя, список параметров, и тип возвращаемого значения подпрограммы), циклы (тогда будут храниться начальное/конечно значения, шаг и тело цикла - сами инструкции, в виде списка инструкций, как я показал выше), или операторы условия (хранящиеся точно так же, как и обычное выражение, в виде дерева)...

А потом - просто проходить по этому построенному списку, и операции, сохраненные в нем записывать, используя синтаксис С. Это может быть, кстати, не только С, а и любой другой императивный язык (с функциональными все гораздо сложнее - там этот подход не пройдет smile.gif ). Есть только несколько вещей, которые уникальны для Паскаля, и с ними надо будет проводить дополнительную работу:
1. Оператор with, о котором выше упомянул Андрей. Потребует перед названиями переменных добавлять полный путь к ним в Сишном коде. Для этого и ссылки на переменные/поля, а не просто их имена.
2. Вложенные подпрограммы. Для этого и нужен список параметров. В Сях нет такой фишки, поэтому придется к списку параметров внутренней подпрограммы добавлять список параметров внешней для нее подпрограммы.

Я понимаю, что это сразу выглядит очень сложно. Но
1) никто и не обещал, что будет легко - задача не из простых, корректно конвертировать программу с одного языка на другой.
2) это сложно, когда оно написано, а ты этого еще не понимаешь. Попробуй нарисовать то, что я набросал, на листке бумаги - ты сразу поймешь, что я имел в виду.

Для реализации всего вышеописанного я бы воспользовался вариантными записями. То есть, часть такой записи:

type
PTItem = ^TItem;
TItem = record
next : PTItem;
case instr: TInstructionType of
insAssign : (src : PExpressionTree; dest : PListItem);
insLoop : ( {поля, необходимые для описания циклов} );
insCondition : ( {поля, необходимые для описания условных выражений} );
{ ... и так далее }
end;


Еще раз повторю: задача - не из простых, ты видела объем кода PtoC? Так что на написание программы, которая будет хотя бы простые тексты конвертировать, у тебя уйдет не один день. И даже не неделя...Жаль, времени мало, написать свой вариант и проверить все предположения - некогда, но если будут вопросы - задавай обязательно, вместе будем разбираться...
TarasBer
Короче, сразу начинай с книги дракона.
Провинциалка
Здравствуйте!
Да, объём PtoC я видела. Мягко говоря впечатляет. Скажу честно - сложно. Кто вообще интересно понимает что там написано? (К тому же я ещё и "немка")
Ваш пост я распечатала, сейчас перечитываю вновь буквально по слогам, т.к. я обязана понять вашу мысль. Ну и досталась же мне тема - конвертация!
Была сегодня на консультации у преподавателя - было уточнено много моментов, один из главных - возможности программы могут ограничиваться переводом самых простеньких программ, в противном случае будут оставаться куски непереведенного текста. Это немного радует. Работа мною уже начата (оформлен интерфейс программы) и продолжается. А без ваших советов, мне так и так не разобраться, поэтому часто придется обращаться. Буквально скоро.
Цитата
Короче, сразу начинай с книги дракона

Эту книгу можно скачать по ссыслке, которая http://groups.google.com/group/sellme-dev/...bbc6c83649aaf56 ?
TarasBer
Цитата(Провинциалка @ 14.12.2011 23:29) *

Да, объём PtoC я видела. Мягко говоря впечатляет. Скажу честно - сложно. Кто вообще интересно понимает что там написано? (К тому же я ещё и "немка")

Конечно, сложно. Потому что конвертёр - это уже почти готовый компилятор. Придумай своя язык, напиши конвертёр в LLVM и компилятор готов.
Цитата

Была сегодня на консультации у преподавателя - было уточнено много моментов, один из главных - возможности программы могут ограничиваться переводом самых простеньких программ,

А, ну тогда просто заменяй = на ==, = на :=, begin и end на {}
Провинциалка
Цитата
А, ну тогда просто заменяй = на ==, = на :=, begin и end на {}

Да, мне и он так посоветовал, да и у меня самой были подозрения так делать. Сейчас вот пока создала интерфейс конвертера. С кнопкой "Сохранить" проблема, не подскажете как исправить?
Провинциалка
Здравствуйте. С кнопкой "Сохранить" разобралась. Подскажите, пожалуйста, как правильно должен выглядеть код для кнопки «Перевести на С++» (procedure TForm1.Button3Click(Sender: TObject); ) , чтобы при нажатии на неё в шапке поля Мемо2 появлялись две строки с определенным текстом?
Krjuger
Ну вы покажите,как вы вообще это делаете(преобразование),я вот гадать не умею, каким все таки вы способом это реализовали.Если в общих чертах то вы должны из одного мемо сначала считать всю информацию,затем сохранить ее в таком виде,который требуется для вашей функции/процедуры перевода,получить результат и вывести его в другой Мемо результата.Более наглядно без некоторых уточнений с вашей стороны вртяли получится.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.