|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 10, 2003 00:04:36 · Поправил: Безпощадный даос Имею вот такое вот в текстовом файле (.c).
aof hashtable[] =
{
{0x1d414ade,SeqHoundFini},{0x1d414bf3,SeqHoundInit},
{0x1cc28cc9,SeqHou ndIsNetEntrezOn},
{0x20285192,SeqHoundNetEntrezInit},
{0x6798c166,SeqHoundGetAccFromRetir edGi},
{0x41464dd2,SeqHoundFindName},
{0,0}
};
да, да, я понимаю, что у некоторых сейчас начнется дрожь и вопли - ДОСТАЛ ТЫ НАС, ИРОД, СВОЕЙ ФИГНЕЙ УЖЕ!!! Простите :) Так вот, мне надо пропарсить его для будущей сортировки по шестнадцатеричным номерам (кстати, если вдруг принципиально, то могут быть и десятичные). Парсить буду на перле. Одно из решений - взять на вход строку и парсить, используя в качетсве разделителя "},", а потом убирать остальной мусор. Но мне не кажется это разумным. Поэтому вопрос - а как парсит и строит свое дерево компилятор в данном случае? Edmond, ты ж знаток, расскажи? Может, уже что-то готовое есть, типа лекса? yacc? Что-то там еще? |
|
|
Дата: Сен 10, 2003 00:49:15 · Поправил: AsmGuru62 'Парсаем' такое простым strtok(). В качестве сепараторов: "{,} \t\r\n". Каждый второй - имя функции, Остальное - значения (если "0х" есть - HEX значить,..) === Oops! Does PERL have the strtok() or similar? |
|
|
Дата: Сен 10, 2003 03:21:44 AsmGuru62 Спасибо. Да, конечно, у перла есть аналог strtok - split. Есть еще и регулярные выражения. Просто я не очень знаю, как можно настроить сплит на прием МНОГИХ разделителей. Надо доки почитать. Но за идею - спасибо. |
|
|
Дата: Сен 10, 2003 04:30:04 volodya Рискну переформулировать задачу :-) Входные данные: Файл следующего содержания: SeqHoundFini SeqHoundInit SeqHoundIsNetEntrezOn SeqHoundNetEntrezInit SeqHoundGetAccFromRetiredGi SeqHoundFindName и т.д.Разделитель (CR,LF) или через пробел или ещё как-то. Алгоритм: Считать весь файл, пропарсить по разделителям и запихнуть токены в hashtable. Второй столбец hashtable будет CRC, ессно. Алгоритм должен по ходу заполнения hashtable подсчитывать CRC. Потом отсортировать всё это дело по значению CRC и вылить в .C ЗЫ: Могу набросать этот алгоритм на Java (Perl давно не юзаю). |
|
|
Дата: Сен 10, 2003 04:32:24 AsmGuru62 Did you mean StringTokenizer in Java? |
|
|
Дата: Сен 10, 2003 15:24:39 volodya На перл это PRCE Вот такое например /\{([a-fx0-9]+),([A-Z0-9_])\}/i Всё. Эта функция пропарсит всё. И если ты вызовишь match(), то в массиве получишь уже готовые 0x1d414ade SeqHoundFindName Но напоминаю. Для того, чтобы не учитывался CASE букв есть модификатор.. Я не помню как он там называется.. + Модификатор, который позволяет пропарсить независимо от CL/CR |
|
|
Дата: Сен 10, 2003 15:26:45 Если я доберусь до хаты то завтра напушу всё сам.. :)) |
|
|
Дата: Сен 10, 2003 18:42:41/\{([a-fx0-9]+),([A-Z0-9_])\}/i
Выглядит неплохо. Но! Вопрос. Смотри вверху - видишь, в одной линии может быть много таких конструкций - {0x1d414ade,SeqHoundFini},{0x1d414bf3,SeqHoundInit},
Соответственно, надо применить это выражение МНОГО раз! Как это сделать? |
|
|
Дата: Сен 10, 2003 19:26:37 · Поправил: volodya Quantum Подумал над твоим предложением. Налабал код для такого дела:
open(FP, "input.txt");
while(<FP>)
{
chomp;
if(/([a-zA-Z]+)/)
{
$output = `hash.exe $1`;
chomp $output;
push @array,[$output, $1];
}
}
@sorted_array = sort {$a->[0] <=> $b->[0]} @array;
foreach(@sorted_array)
{
print "{$_->[0],$_->[1]},\n";
}
close(FP); |
|
|
Дата: Сен 10, 2003 20:35:22 volodya $output = `hash.exe $1`; Неужели в Перле нету ф-ции для CRC32? ЗЫ: Не в почёте нынче Java :-) |
|
|
Дата: Сен 10, 2003 21:36:10 Quantum Я делаю как мне проще. Кроме того, у меня не чистое CRC32 - так, гибридик. Кроме того, изящные решения никому не нужны. Я мудохался, писал прототип этого движка, мучил себе башку с qsort/bsearch, вас всех напрягал, подготовил доклад - а это никому не надо. Называется - дурак с иннициативой. И насрать им всем, что выпускают они МУСОР, по большому счету. Ну а если им наплевать, почему меня это должно волновать? Закрыта тема. ПЛЕВАТЬ!!! :(((( |
Эта тема закрыта. Отвђты больше не принимаются. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.080 |