Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Трансляция: Pascal -> C, Перевод простых программ с Pascal на C. 
:(
    Опции темы
СтудентИзРоссии
  Дата 29.1.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день.

Необходимо транслировать прогрумма на Pascal в программу на C.

Необходимо:
1) Пропарсить секцию var;
2) Пропарсить присваивание.
3) Пропарсить комментарии.
4) Пропарсить функцию.
5) Пропарсить присваивание на вид арифметического значения (проверить его).
6) Пропарсить IF где фигурирует арифметические значения.
7) Если есть ошибки, то вывести их.

Если кто-нибудь когда-нибудь делал, что-нибудь похожее,
пожалуйста, дайте совет с чего начать, как подобраться
к решению этой задачи.

p.s. Курсовая.

Пример. Pascal:

Код
program student;

var
     i:integer;
     a,b,c:integer
     mas:array[1..10] of integer;


function return_integer(a:integer;b:integer;c:integer):integer;
var
    i:integer;
    a,b,c:integer;

begin
i := 100;
a := 1;
b := 2;
c := i+a-b;

return_integer:=c;
end;

(* комментарий *)

begin
i:=555;

{многострочный
комментарий}

a:=100;
b:=200;
c:=c+100-50*1/50*a;

   if (c+100-50*1/50*a) > (c+100-50*1/50*a) then
   begin
   a:=100;
   end;

   if (c+100-50*1/50*a) < (c+100-50*1/50*a) then
   begin
   a:=100;
   end;

   if (c+100-50*1/50*a) = (c+100-50*1/50*a) then
   begin
   a:=100;
   end;

   if (c+100-50*1/50*a) >= (c+100-50*1/50*a) then
   begin
   a:=100;
   end;

   if (c+100-50*1/50*a) <= (c+100-50*1/50*a) then
   begin
   a:=100;
   end;

end.


Результат, который должен получиться после трансляции Pascal -> C:

Код

int return_integer(int a,int b,int c)
{
int i;
int a,b,c;

i = 100;
a = 1;
b = 2;
c = i+a+b;

return c;
}


/* комментарий */

void main()
{
int i;
int a,b,c;
int mas[10];

i=555;

/*многострочный
комментарий*/
a=100;
b=200;
c=c+100-50*1/50*a;

   if((c+100-50*1/50*a) > (c+100-50*1/50*a))
   {
   a=100;
   }

   if ((c+100-50*1/50*a) < (c+100-50*1/50*a)
   {
   a=100;
   }

   if ((c+100-50*1/50*a) = (c+100-50*1/50*a))
   {
   a=100;
   }

   if ((c+100-50*1/50*a) >= (c+100-50*1/50*a))
   {
   a=100;
   }

   if ((c+100-50*1/50*a) <= (c+100-50*1/50*a))
   {
   a=100;
   }
}

PM MAIL   Вверх
Void
Дата 29.1.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Писал такой транслятор.

Генератор парсеров (flex+bison, Coco/R, ANTLR…) и формальную грамматику Паскаля (неплохой вариант есть в этом стандарте) в руки и вперёд. Конкретные советы можно давать, когда появятся конкретные вопросы.

Это сообщение отредактировал(а) Void - 29.1.2007, 18:10


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
СтудентИзРоссии
  Дата 30.1.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Void @ 29.1.2007,  18:09)
Писал такой транслятор.

Генератор парсеров (flex+bison, Coco/R, ANTLR…) и формальную грамматику Паскаля (неплохой вариант есть в этом стандарте) в руки и вперёд. Конкретные советы можно давать, когда появятся конкретные вопросы.


Конкретный вопрос:
подскажите алгоритм парсинга следующего кода:

Код
program student;

var
    i:integer;
    a,b,c:integer;
    mas,mas2:array[1..10] of integer;

begin
a:=123;
end.


Для перевода его в код на C.
PM MAIL   Вверх
SerpentVV
Дата 30.1.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Конечные автоматы тебе помогут...
Алгоритм показать - это фактически его за тебя написать...
А это достаточно кропотливая работа... 

PM MAIL   Вверх
СтудентИзРоссии
  Дата 30.1.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(SerpentVV @ 30.1.2007,  15:15)
Конечные автоматы тебе помогут...
Алгоритм показать - это фактически его за тебя написать...
А это достаточно кропотливая работа...

За что хоть уцепиться? Куда копать? С чего начать?

Выше дали большущий доумент спецификации Pascal,
но он к сожалению на английском, мало что понятно,
да и объём слишком большой, если есть
возможность, подскажите реализацию.
PM MAIL   Вверх
Void
Дата 30.1.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(СтудентИзРоссии @  30.1.2007,  11:43 Найти цитируемый пост)
подскажите алгоритм парсинга следующего кода:

Курсовая по какому предмету-то? У меня есть смутное подозрение, что теорию синтаксического анализа и трансляции вам в каком-то объёме должны были дать.
Я не знаю, какие у вас конкретные требования к этой курсовой. Синтаксический разбор — достаточно объёмная и нудная вещь, которую можно и нужно автоматизировать. Этим занимаются генераторы парсеров, которые я перечислил. Однако, если нет понятия о том, что такое формальная грамматика, они мало чем помогут.
Для ручного кодирования (если таковы требования) наилучшим образом, на мой взгляд, подходит метод рекурсивного спуска.
Цитата(СтудентИзРоссии @  30.1.2007,  18:19 Найти цитируемый пост)
Куда копать?

Читать «Компиляторы. Принципы, технологии, инструменты» Ахо, Сети, Ульмана (aka «Книга Дракона»). Ничего более доступного и в то же время полного по этой теме не написано.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
СтудентИзРоссии
Дата 30.1.2007, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Void @ 30.1.2007,  17:54)
Цитата(СтудентИзРоссии @  30.1.2007,  11:43 Найти цитируемый пост)
подскажите алгоритм парсинга следующего кода:

Курсовая по какому предмету-то? У меня есть смутное подозрение, что теорию синтаксического анализа и трансляции вам в каком-то объёме должны были дать.
Я не знаю, какие у вас конкретные требования к этой курсовой. Синтаксический разбор — достаточно объёмная и нудная вещь, которую можно и нужно автоматизировать. Этим занимаются генераторы парсеров, которые я перечислил. Однако, если нет понятия о том, что такое формальная грамматика, они мало чем помогут.
Для ручного кодирования (если таковы требования) наилучшим образом, на мой взгляд, подходит метод рекурсивного спуска.
Цитата(СтудентИзРоссии @  30.1.2007,  18:19 Найти цитируемый пост)
Куда копать?

Читать «Компиляторы. Принципы, технологии, инструменты» Ахо, Сети, Ульмана (aka «Книга Дракона»). Ничего более доступного и в то же время полного по этой теме не написано.

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

Не могли бы ли Вы привести пример рекурсивного
спуска по какой-либо части Pascal кода с трансляцией его в код на С?

Хотя бы на примере:

Код
program student;
var
    i:integer;
    a,b,c:integer;
    mas,mas2:array[1..10] of integer;
begin
a:=123;
end.

PM MAIL   Вверх
Romikgy
Дата 30.1.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



имхо примерно так
Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
program student;

типа название проги , оно не надо для проги вообще
Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
integer

int 
Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
array[1..10] of

заменяем на [10]
Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
begin

{
Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
a:=123;

a = 123;
Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
end.

}
для основных скобок
Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
begin

Цитата(СтудентИзРоссии @  30.1.2007,  21:29 Найти цитируемый пост)
end.

именно с точкой заменяется на 
int  main()
{
}
в конце получаем
Код

int i;
int a , b , c;
int mas[10], mas2[10];
int main()
{
a=123;
}




--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
jonie
Дата 31.1.2007, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



бог в помощь... я когда-то даавно парился с переводм pascal->asm .. но сорцы потерял (у нас было в курсе  Основы трансляторов и чета там).
Карпов. Классическая теория компиляторов. Учебное пособие.
Методическое пособие : Формальные грамматики.
Основы построения трансляторов. Кампаниец,Маньков, Филатов.
мб че пригодится...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
jonie
Дата 31.1.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



еще добросил каталог ссыл на сопуствующие сайтики : там


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Бонифаций
Дата 2.2.2007, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В линуксах есть такая утилита p2c которая транслирует исходный код с дюжины диалектов паскаля в c.

Проще взять и посмотреть как она делает.
http://directory.fsf.org/p2c.html


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
СтудентИзРоссии
Дата 23.2.2007, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо за советы, часть этого хозяйства успешно написана:
http://forum.vingrad.ru/index.php?showtopi...t&p=1039136
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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