Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Delphi _ Конвертация кодов

Автор: Провинциалка 8.12.2011 23:11

Здравствуйте! Очень нуждаюсь в помощи настоящих знатоков языков программирования Delphi и C++.
Дело в том что я должна решить задачу по следующей теме: Конвертирование программ с одного языка программирования на другой Delphi < > C++

Я её понимаю так что нужно написать программу, конвертирующую код с одного языка программирования на другой, а именно с Delphi на C++. А как это сделать, ума не приложу. Просмотрела здесь массу похожих тем, ничего толкового не нашла. Не знаю даже от чего оттолкнуться.
Подскажите хорошую идею

Автор: IUnknown 8.12.2011 23:24

Самая хорошая идея - посмотреть, как это делает утилита http://www.garret.ru/pascal.html, чтоб было от чего отталкиваться. Заодно почитать здесь: http://www.garret.ru/ptoc/Readme.htm

Автор: Провинциалка 9.12.2011 0:11

Не судите меня строго, но боюсь, что мне сложно будет разобраться в этом море информации. Особенно если учесть, что google перевел страницу на русский так как будто её писал русскоговорящий китаец. Если не трудно, объясните как работает ptoc354

Добавлено через 5 мин.
Пойду спать, завтра с новыми силами начну усиленно вдумываться в материал

Автор: Lapp 9.12.2011 7:19

Цитата(Провинциалка @ 9.12.2011 1:11) *
Не судите меня строго

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

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

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

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

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

Да, и еще один вопросик к тебе - сама прога-то на каком языке будет? на Дельфи, судя пр разделу, который ты выбрала? Надеюсь, ты не собираешься ее по ходу дела конвертировать туда обратно как подопытного кролика.. smile.gif

Автор: Провинциалка 9.12.2011 11:28

Спасибо!
Отвечу по порядку:
1.

Цитата
Обратная же задача.. Она тоже разрешима, но пота и крови придется пролить поболе

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

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

Автор: IUnknown 14.12.2011 11:25

Что-то темка приутихла...

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

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 14.12.2011 11:48

Короче, сразу начинай с книги дракона.

Автор: Провинциалка 14.12.2011 23:29

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

Цитата
Короче, сразу начинай с книги дракона

Эту книгу можно скачать по ссыслке, которая http://groups.google.com/group/sellme-dev/...bbc6c83649aaf56 ?

Автор: TarasBer 15.12.2011 9:19

Цитата(Провинциалка @ 14.12.2011 23:29) *

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

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

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

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

Автор: Провинциалка 15.12.2011 21:43

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

Да, мне и он так посоветовал, да и у меня самой были подозрения так делать. Сейчас вот пока создала интерфейс конвертера. С кнопкой "Сохранить" проблема, не подскажете как исправить?


Прикрепленные файлы
Прикрепленный файл  _________.rar ( 11.57 килобайт ) Кол-во скачиваний: 298

Автор: Провинциалка 17.12.2011 0:42

Здравствуйте. С кнопкой "Сохранить" разобралась. Подскажите, пожалуйста, как правильно должен выглядеть код для кнопки «Перевести на С++» (procedure TForm1.Button3Click(Sender: TObject); ) , чтобы при нажатии на неё в шапке поля Мемо2 появлялись две строки с определенным текстом?

Автор: Krjuger 23.12.2011 0:14

Ну вы покажите,как вы вообще это делаете(преобразование),я вот гадать не умею, каким все таки вы способом это реализовали.Если в общих чертах то вы должны из одного мемо сначала считать всю информацию,затем сохранить ее в таком виде,который требуется для вашей функции/процедуры перевода,получить результат и вывести его в другой Мемо результата.Более наглядно без некоторых уточнений с вашей стороны вртяли получится.