· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› Header converters: to be or not to be?

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Ноя 3, 2003 02:02:22

bsl_zcs
Такой большой, а в сказки веришь.
Ага! Поверил, да так, что уже вторую неделю за Perl-ом сижу, изучал ускоренным темпом.

volodya
Смотреть на codeproject.com
Ух, сколько там всего! Только вот чтоБрать и конвертить?

Но всё равно, спасибо!


Дата: Ноя 3, 2003 22:02:31

2 IceStudent:
уже вторую неделю за Perl-ом сижу

Ну, это завсегда полезно. Хотя бы для того, чтобы чётко представлять границы применимости инструментов. ;)

Посмотрел я C::Scan. В принципе, после лёгкой обработки напильником, видимо, обусловленной отсутствием у меня потребного ему сишного препроцессора, он оказался вполне работоспособным.

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

В простейшем случае, вызывается так:
use C::Scan;
$c = new C::Scan 'filename' => 'tst.c';

После чего, методом get из него извлекается куча разных результатов вскрытия. ;) Например, $c->get('parsed_fdecls') - список распарсеных определений функций, и так далее.

В общем, вот такой тестовый исходник:
#define ZTST1 1
#define ZTST2(x) 1*(x)

extern void zexit();

typedef struct { int a,b; float f; } TESTSTRUCT;

float func2(
    int a, 
    float b
)
{
	a=b;
	return 0.0;
}

void main(int argc, char *argv[])
{
    zexit();
}
он разбирает на запчасти следующим образом:
Дефайны без параметров - $c->get('defines_no_args'):
("ZTST1", 1)
С параметрами - $c->get('defines_args'):
("ZTST2", [["x"], "1*(x)"])
Тайпдефы - $c->get('typedef_hash'):
{ TESTSTRUCT => [" struct { int a,b; float f; } ", ""] }
Распарсеная структура этого тайпдефа - ${$c->get('typedef_structs')}{'TESTSTRUCT'}:
[
  ["int", undef, "a"],
  ["int", undef, "b"],
  ["float", undef, "f"],
]
Распарсеные определения функций - $c->get('parsed_fdecls'):
[
  ["void", "zexit", [], "void zexit()", undef],
  [
    "float",
    "func2",
    [
      ["int", "a", undef, "int a", ""],
      ["float", "b", undef, "float b", ""],
    ],
    "float func2(\n    int a,\n    float b\n)",
    undef,
  ],
  [
    "void",
    "main",
    [
      ["int", "argc", undef, "int argc", ""],
      ["char *", "argv", undef, "char *argv[]", "[]"],
    ],
    "void main(int argc, char *argv[])",
    undef,
  ],
]

Как видишь, многое, если не практически всё, из того что нужно, из него добывается нахаляву. Слепить из этого что-нибудь в формате твоего ассемблера не должно быть слишком сложно.

Правда, когда он чего-нибудь не сожрёт, тебе будет проще исправить оригинал до понимаемого им вида, чем разбирать и править его исходник под тысячу строк. ;) Хотя, скорее всего, руками придётся работать в любом случае, какой навороченый парсер бы ни был...

Скормил ему на пробу winuser.h - дык, он его героически распарсил, правда в двух или трёх местах на что-то ругался. В общем, с этим уже сам будешь разбираться. Если вообще на это заморочишься, конечно... ;)

А вообще, там граблей разложен не один квадратный километр. Например, я себе слабо представляю, что ты будешь делать со всякими #pragma pack-ами и иже с ними... Видимо, для некоторых вещей действительно лучше воспользоваться советом Four-F-а.

2 volodya:
Дык, я, вроде, и не уходил никуда. ;) Времени, правда, не хватает ни на что, поэтому пишу очень редко.
Как по твоему, на этот раз я никого не пнул ненароком? ;)

Брать и конвертить
Если бы всё было так просто. Заморочек везде хватает, и полностью автоматически конвертировать, боюсь, в любом случае, не получится. Главное - определиться до какой степени имеет смысл это всё автоматизировать. Потому, что на реализацию поддержки пяти процентов редких случаев уйдёт девяносто пять процентов общих усилий. Впрочем, как и всегда. ;)


Дата: Ноя 4, 2003 07:52:36

отсутствием у меня потребного ему сишного препроцессора
А в ActivePerl он есть?

Не стоит только снова проявлять такую наивность
Да, нет, я и не проявляю. Я потому и справшивал прогу с исходниками, чтобы если что, поправить.

А то, что всё равно руками доделывать, то это нормально.
Ведь не всё же вручную делать, а только часть, это уже хорошо!

что ты будешь делать со всякими #pragma pack-ами
Они меня не заботят пока.

Спасибо за помощь всем, кто откликнулся!


Дата: Ноя 5, 2003 00:37:07

И вот ещё:
Почему не запускается C::Scan?
Он требует отсутствующий модуль (Data::Flow), да и говорит, что метода new у него нет.
А я просто запускал тестовый скрипт из пакета C::Scan...


Дата: Ноя 7, 2003 20:01:47

Прошу прощения за задержку с ответом - в командировке был.

Не запускается он по той простой причине, что ему действительно необходим этот модуль. :)

Скачай ещё и этот Data::Flow, больше он, вроде бы, ничего не хочет. Или, как вариант, ставь модули с ppm-а. Он автоматом завсимости отрезолвит.

Дальше, в ActiveState-овском дистрибутиве Перла сишного препроцессора нет. Он, по смыслу, должен быть в дистрибутиве какого-нибудь сишного компилятора. Скрипт просто вызывает штатный сишный препроцессор для того, чтобы не возиться со всякими #ifdef-ами и прочим. Под юниксами на самом деле вызывается gcc -E, если я ничего не путаю. Под виндами тебе, наверное, будет проще прогнать исходник препроцессором самому, каким-нить Инвижуал Це, а скрипт запатчить, чтобы он просто из файла читал. В том верианте, что у меня, для этого надо строчки
    (open($sym, $cmd) or die "Cannot open pipe from `$cmd': $!")
      and bless $sym => $class;

заменить, например, на
     open ($f, $filename);
     $f;


В принципе, после этого, оно уже может выдавать то, что я сюда постил. Не знаю, есть ли в том пакете тестовый скрипт, я на него не смотрел.


Дата: Ноя 12, 2003 15:02:35

А вот такой вопрос:
Можно ли всё-таки использовать препроцессор в модуле из какого-нибудь установленного компилятора Си? И можно ли использовать данный модуль в Linux? Я пробовал, он сильно ругается...

прогнать исходник препроцессором самому
Как это самое сделать? Есть опция у VC++ /E, а как её использовать?

И ещё: bsl_zcs, нельзя ли связаться по э/почте, а то доступ в форум у меня только "по праздникам"...
У меня адрес на ukr.net: icestudent.

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.087