|
|
| Посл.отвђт | Сообщен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. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.087 |