LINUX.ORG.RU

конвертер программы с языка Си на язык Паскаль


0

2

Надо написать конвертер программы с языка Си на язык Паскаль. НА С++. В голове стразу же представилось, какая форма и прочее... а вот представления, что и как делать вообще нет. Немножко разобравшись понял что надо Синтаксический анализ, синтаксическое дерево. За это надо хвататься?? Если да.. как их написать...не имею никакого понятия.. Посоветуйте что нибуть Зарание спасибо!


Не с С на Паскаль, а с С++ на Object Pascal. На память не скажу, но есть шанс, что изначально был уговор написать конвертор с Паскаля на С. И тему Вы выбирали себе сами. Смею вас заверить, что за 10 лет очень мало кто сдох. Полностью согласен с коллегами насчет лекций и книг, конкретно Дрэгон бука. Могу только посоветовать почаще задавать вопросы на лекциях, просить разъяснить что не ясно. Начать предлагаю просто с проверки корректности простой программы. Ну и учите языки. Например, русский. Понимаю, что в форумах не принято смотреть на корректность лексики, но на «Посоветуйте что нибуть» могу посоветовать нибать в другом месте.

Если я всё правильно понял, Ваш преподаватель.

anonymous
()
Ответ на: комментарий от anonymous

с С++ на Object Pascal

Звучит как «конвертер с эскимосского на рапануйский».

Дрэгон бук

А он у вас в библиотеке есть? В наше время dragon book стоит сравнительно немалых денег.

buddhist ★★★★★
()
Ответ на: комментарий от anonymous

Вот название темы: «написать Конвертер программы с языка Си на язык Паскаль». Тему я себе не выберал, она попала под мой номер. К преподователю идти на лекцию с вопросами совсем безсполезно ибо знаний у него столько же сколько и у меня. Вот с книг и начну. Насчёт русского языка, да вывучу спачатку сваю родную мову, потым жа рускі.

Если я всё правильно понял, Ваш ученик.

Ss
() автор топика
Ответ на: комментарий от buddhist

В наше время dragon book стоит сравнительно немалых денег.

ХЗ. Купил в 90-х новую, в книжном, будучи еще безработным (и хронически безденежным) студентом :) Выбор был пожрать/купить пузырь и поехать расслабляться к одной тян в медицинскую общагу/купить драгонбук. Хорошая книжка. Толстая. (Когда из медициской внезапно приехала тян - расслаблять, с пузырем(они там девушки без комплексов нащод Russian Reversal) - и кровать в общаге сломалась (закон Мерфи, да), ножку подперли драгонбуком. ЧСХ, конструкция выдержала!)

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Ну, сейчас драгонбук стоит около 1.5к, в мою бытность студентом в общаге у меня было денег — 2к в неделю и иногда я все же покупал такие книги :)

buddhist ★★★★★
()
Ответ на: комментарий от slackwarrior

Ну щас и стипендии не те что в 90-х :)

да ладно... «не верю!»(с) %)

и опять оффтопик:

что есть эта мифическая книга дракона? 10 минут гугления по «dragon book» дали кучу ссылок на книжки фентези и на картинки с полуголыми дядьками %)

metawishmaster ★★★★★
()
Ответ на: комментарий от Ss

Видимо мы друг друга не правильно поняли. Но Вы очень похожи на моих студентов.

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

А про язык... Ну что, вучыця (если я правильно написал).

anonymous
()
Ответ на: комментарий от anonymous

Прямо сейчас на паре проконсультировался с преподователем. Он сказал: -«Это одна из простых курсовых, которая у меня есть. Всё очень просто. Надо использовать if и swich и всё получится. »

Он прав? вучыцца=)

Ss
() автор топика
Ответ на: комментарий от Ss

он вообще не представляет себе сложность задачи, что в общем-то и хорошо - сдашь без проблем

vaino
()
Ответ на: комментарий от Ss

Если он так говорит, то не понимает всего объёма задачи и требует конвертации на очень примитивном уровне. Тогда делай простой поиск и замену ключевых слов, плюс поменять местами в объявлении тип переменной и её имя. ну и в теле основной программы сделать вызов main.

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Если он так говорит, то не понимает всего объёма задачи и требует конвертации на очень примитивном уровне. Тогда делай простой поиск и замену ключевых слов, плюс поменять местами в объявлении тип переменной и её имя. ну и в теле основной программы сделать вызов main.

Не, лучше упороться материалом и сделать правильно. И потом, на сдаче, смотреть на пятикопеечные глаза препода :) Если тот адекватен - поудивляется немного и примет с отметкой «отлично».

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Быстрей будет так: он высмеет меня перед всеми=)..Он так всегда делает, если не знает чего то. А знаний и уровень преподования низкий. ВОт такие преподы в универах)

Всем спасибо за ответы

Ss
() автор топика
Ответ на: комментарий от Ss

не, я на полном серьёзе. Судя по всему, ты и так достаточно хорошо знаешь русский (что неудивительно, не знаю как везде, но за три дня в Минске белорусский слышал только в транспорте при объявлении остановок).

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

Увы но этот язык уже «мёртвый». И очень жаль( Не русский как видимо я не очень хорошо знаю).

Ss
() автор топика
Ответ на: комментарий от Ss

Быстрей будет так: он высмеет меня перед всеми=)..Он так всегда делает, если не знает чего то. А знаний и уровень преподования низкий. ВОт такие преподы в универах)

Бывает. У меня, помню, как-то подобная история была, но преподавателем был молодой недавний аспирант, так что особых проблем при сдаче не было.

Вообще, если есть ещё время, спроси какого рода разбор он хочет - ручной (конечный автомат (на что намекают if / switch, но так как бы и вложенных выражений разобрать не получится), recursive ascent parser (для LR-грамматик), recursive descent parser (для LL-грамматик), table-driven LR parser, table-driven LL parser) или с использованием существующих генераторов парсеров.

В любом случае, идея в том, что из текста программы на си путём разбора получаем AST (в С++ это будут структуры и объединения) из которого путём обхода генерируется текст программы на паскале. Так что можешь ещё спросить, предполагается ли построение AST (какую-то хоть сколько-нибудь серьёзную трансляцию напрямую и в один проход сделать ведь не получится).

Кстати, http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/ - С++, Flex, Bison. Части 1-5 - разбор си-подобного языка и построение AST, 6 - генерация кода для LLVM из построенного AST (то же самое нужно проделать для паскаля).

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Думаю что если я спрошу он не поймёт, и будет мне опять же твердить про if, switch(ибо такая ситуация уже была). Наверное хочет показать администрации что задаёт крутые курсовые, а сделаны они примитивно)) Можно было бы сделать аля простой поиск и замену ключевых слов, плюс поменять местами в объявлении тип переменной и её имя. ну и в теле основной программы сделать вызов main.(с.KivApple). Но мне не очень хочется так делать. Это уже если ничего не получится прибегну к такому)

Значит по идее надо изучить что такое AST ? и что еще? Я впервые сталкиваюсь с такой разработкай. ибо на парах лабы только аля решение математических уровнений)

Ss
() автор топика
Ответ на: комментарий от Ss

Значит по идее надо изучить что такое AST ?

AST (для достаточно сложного языка) это рекурсивная структура данных в памяти (дерево или граф). Например, для текста

    while (b != 0)
        if (a > b)
            a = a − b;
        else
            b = b − a;

    return a;

нужно построить в памяти такое дерево - http://upload.wikimedia.org/wikipedia/commons/c/c7/Abstract_syntax_tree_for_E.... Это нужно за тем, что доступ к узлам константный (а не линейный поиск в тексте), преобразовывать и сворачивать дерево просто (сама структура дерева отражает грамматическую структуру языка, поэтому то что Кнут называл семантическими атрибутами реализуется как код выполняемый для узлов дерева разного типа).

и что еще?

Текст --|лексический анализ|--> Список лексем --|синтаксический разбор|--> AST --|pretty printer|--> Текст

Структуры данных:

  • Как будешь представлять текст?
  • Списки?
  • Есть опыт работы с рекурсивными структурами данных и рекурсивными функциями?

Алгоритмы:

  • Лексического анализа.
  • Синтаксического разбора.
  • Отображения и свёртки деревьев.

Можешь форкнуть github.com/lsegal/my_toy_compiler, загуглить BNF для C, дописать грамматику и написать генератор в паскаль (точнее, pretty printer, BNF и AST паксаля тут не нужны). И да, у C++ больной подход к декомпозиции :) Тут это можно наблюдать в виде зависимости кода для AST от LLVM.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Структуры данных:

1. Текст будет в файле.. блокнот или сразу на си написанная простенькая программа(если правильно понял) 2. Составлю тхт файл где допустим справа будет Си ({}), слева Паскаль(begin, end) (если я правильно понял) 3. Опыта нет.

Ss
() автор топика
Ответ на: комментарий от slackwarrior

(Когда из медициской внезапно приехала тян - расслаблять, с пузырем(они там девушки без комплексов нащод Russian Reversal) - и кровать в общаге сломалась (закон Мерфи, да), ножку подперли драгонбуком. ЧСХ, конструкция выдержала!

Вот это я понимаю история, есть чем гордиться!

anonymous_sama ★★★★★
()
Ответ на: комментарий от Ss

Под текстом (для *.c, *.pas и лексем) и списками (для выхлопа лексера) имелись ввиду char*, string, FILE, iostream и list, vector - на выбор.

После того как example.c был прочитан в память, или открыт как поток, и до того как нужно записать example.pas, операций с диском делать не нужно - только манипулировать структурами данных в памяти (то что имелось ввиду под «структуры данных», т.е. примитивные / struct / union / class) с помощью алгоритмов (функций / методов). По крайней мере, если делать через -> список лексем -> AST ->, т.е. на синтаксическом уровне (на лексическом уровне мы просто линейно проходим по потоку знаков, выполняя нужные преобразования, так, например, можно лексер написать, на синтаксическом уровне мы обрабатывем вход (лексем) с помощью рекурсивных процедур, возможно с lookahead, возможно с backtracing, возможно опираясь на таблицу переходов, возможно строя нелинейный и рекурсивный AST или _сразу_ выполняя emit).

Опыта нет

Как дерево реализовать с помощью struct или разобрать / вычислить выражение вида «1 + 3 * (4 + (5 - 8) / 9)» не давали? Просто если курс был по синтаксическому разбору это же the must.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Эм... есть ли у вас ася? Надоедать каждыми днями неочень «умными» вопросами я не буду)

Ss
() автор топика
Ответ на: комментарий от Ss

Эм... есть ли у вас ася?

Нету, есть почта в профиле, но кучку-другую вопросов можно задать прямо тут - не отвечу я, кто-нибудь другой подскажет.

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

=) «Под текстом (для *.c, *.pas и лексем) и списками (для выхлопа лексера) имелись ввиду char*, string, FILE, iostream и list, vector - на выбор.» Если на выбор..брать char. И на второй впорос, насчёт Списки. правильно мыслел или нет

Странно как то что здесь еще не предложили сделать работу за деньги

Ss
() автор топика
Ответ на: комментарий от Ss

Если на выбор..брать char. И на второй впорос, насчёт Списки. правильно мыслел или нет

iostream для чтения/записи в файлы, string для токенов/идентификаторов, vector для разного рода списков, свои классы для AST - как-то так, наверное.

Нужно ещё надеяться, что, с точки зрения препода, C++ != C :)

Странно как то что здесь еще не предложили сделать работу за деньги

Попроси перенести в www.linux.org.ru/forum/job/, озвучь условия, хотя тут выше вроде была ссылка на похожий курсач (курсачи имеют свойство утекать в интернеты).

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Начал читать, разбираться.. Каша, просто каша в голове. Воощем надо написать алгоритмы. Самое первое начать с синтаксического анализа?. Если да, можно больше информации про него? В гугле много пишется про него, и примеров много, но что и как не понять.Пока что)

Ss
() автор топика
Ответ на: комментарий от Ss

вот, кстати, по поводу парсера, лексера и AST, посмотри туториал llvm'ный, там, конечно всё примитивненько и ручками, но зато просто и доступно: http://llvm.org/docs/tutorial/

shty ★★★★★
()
Ответ на: комментарий от quasimoto

дерево

«1 + 3 * (4 + (5 - 8) / 9)»

Это можно сделать за один проход, руля стеком в соответствии со скобками и операциями.

Поскольку си и паскаль - языки одного типа, также можно сконвертить, пройдясь линейно.

alfix
()
Ответ на: комментарий от alfix

Поскольку си и паскаль - языки одного типа, также можно сконвертить, пройдясь линейно.

Я плохо помню паскаль, если не будет тонкостей требующих source-to-source, то почему бы нет.

quasimoto ★★★★
()
Ответ на: комментарий от Ss

Самое первое начать с синтаксического анализа?

Лексический и синтаксический, да.

Грубо говоря, из текста (iostream)

int add(int a, int b) {
  return a + b; // foo
}

путём лексического анализа получается список (vector) лексем:

"int", "add", "(", "int", "a", ",", "int", "b", "(", "{", "return", "a", "+", "b", ";", "}"

или

TYPE_INT, FUN_ID "add", FUN_ARGS_START, TYPE_INT, NAME_ID "a", FUN_ARGS_COMMA, TYPE_INT, NAME_ID "b", FUN_ARGS_END, FUN_START, SPEC_RETURN, NAME_ID "a", OP_PLUS, NAME_ID "b", OP_SEMI, FUN_END

который потом обходится рекурсивными процедурами - строится AST, либо сразу пишется выхлоп в *.pas (если так получится).

Нужно определиться для начала - парсить вручную (как тут - http://llvm.org/docs/tutorial/) или с использованием генератора парсеров (compiler-compiler, как тут - http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/), ни и читать и писать какой-нибудь релевантный код - от простого к сложному, либо сразу пытаясь решить эту задачу, параллельно с этим читать какую-нибудь книжку по теме (список некоторых - http://stackoverflow.com/tags/compiler/info).

quasimoto ★★★★
()
Ответ на: комментарий от quasimoto

Собственно вот то самое правило, которое дает неоднозначность еще для лексера:

{L}({L}|{D})* { count(); return(check_type()); }

Нам надо знать является ли ИД именем переменной или типа. Но они неразличимы. проблемы была бы решена если бы в стиле того же хаскеля переменные начинались с маленькой буквЫ, а типы - с большой. Обратно - грамматика хаскеля стала бы КЗ, если бы в нем не было такой фичи :)

anonymous
()
Ответ на: комментарий от quasimoto

Обьясни мне это: Вообщем в этой статье http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/5/ как потом это всё собирается, и вообще как запустить полученное?

Так же на этой же странице есть такая строчка: You can then compile your source files: $ g++ -o parser parser.cpp tokens.cpp main.cpp «Вы можете скомпилировать исходные файлы: $ g++ -o parser parser.cpp tokens.cpp main.cpp»

Как их скомпилировать.?

Ss
() автор топика
Ответ на: комментарий от Ss

Как их скомпилировать.?

Вот так: $ g++ -o parser parser.cpp tokens.cpp main.cpp

anonymous
()
Ответ на: комментарий от Ss

Как их скомпилировать.?

git clone git://github.com/lsegal/my_toy_compiler.git
cd my_toy_compiler
# maybe some changes
make
quasimoto ★★★★
()
Ответ на: комментарий от slackwarrior

и кровать в общаге сломалась (закон Мерфи, да), ножку подперли драгонбуком. ЧСХ, конструкция выдержала!)

[история успеха]

anonymous
()
Ответ на: комментарий от Ss

Значит по идее надо изучить что такое AST ? и что еще? Я впервые сталкиваюсь с такой разработкай. ибо на парах лабы только аля решение математических уровнений)

Ещё раз повторю. Начните с теории =) Того же Ахо почитайте.

А к практике потом приступите - после полного понимания того, что прочитаете.

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

он быстрей и*иот!. Тролим мы его) Ну да ладно) Боюсь что на теорию времени уже не очень много). Фиг с ними не сдам.пускай выгоняют

Ss
() автор топика
Ответ на: комментарий от Ss

Аккуратнее вам так с преподами... вам ещё диплом надо защищать/получать. Чуть больше уважения, это ок?

BattleCoder ★★★★★
()
Ответ на: комментарий от BattleCoder

Того же Ахо почитайте.

Учитывая уровень ТСа, тут больше подойдет «Давайте создадим компилятор» Креншоу.

geekless ★★
()
Ответ на: комментарий от geekless

Учитывая уровень ТСа - за такие задачи лучше не браться. Я и сам не стал за такое браться... хотя, думаю, возможность взять что-то подобное (но лучше наоборот, из паскаля в сишку, например) была... но учитывая, что у нас был такой курс =) нас всё это объясняли, я знаю, какой это геморрой.

Лучше взять себе что-то попроще... и пополезнее для общества ;) например, доработать любой опенсурс-проект... везде полно багов.

BattleCoder ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.