Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Трансляция: Pascal -> C


Автор: СтудентИзРоссии 29.1.2007, 16:47
Добрый день.

Необходимо транслировать прогрумма на 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;
   }
}

Автор: Void 29.1.2007, 18:09
Писал такой транслятор.

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

Автор: СтудентИзРоссии 30.1.2007, 09:43
Цитата(Void @ 29.1.2007,  18:09)
Писал такой транслятор.

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


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

Код
program student;

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

begin
a:=123;
end.


Для перевода его в код на C.

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

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

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

Выше дали большущий доумент спецификации Pascal,
но он к сожалению на английском, мало что понятно,
да и объём слишком большой, если есть
возможность, подскажите реализацию.

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

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

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

Автор: СтудентИзРоссии 30.1.2007, 22:29
Цитата(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.

Автор: Romikgy 30.1.2007, 23:09
имхо примерно так
Цитата(СтудентИзРоссии @  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;
}


Автор: jonie 31.1.2007, 01:27
бог в помощь... я когда-то даавно парился с переводм pascal->asm .. но сорцы потерял (у нас было в курсе  Основы трансляторов и чета там).
http://e-jonie.narod.ru/files/karpov_kompilteory.rar
http://e-jonie.narod.ru/files/formal_gramma.rar
http://e-jonie.narod.ru/files/osnovi_translatorov.rar
мб че пригодится...

Автор: jonie 31.1.2007, 21:57
еще добросил каталог ссыл на сопуствующие сайтики : http://e-jonie.narod.ru/links/compile.xml

Автор: Бонифаций 2.2.2007, 01:14
В линуксах есть такая утилита p2c которая транслирует исходный код с дюжины диалектов паскаля в c.

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

Автор: СтудентИзРоссии 23.2.2007, 13:22
Всем спасибо за советы, часть этого хозяйства успешно написана:
http://forum.vingrad.ru/index.php?showtopic=137295&view=findpost&p=1039136

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)