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

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ZEN —› Знатоки компиляторов?

Посл.отвђт Сообщен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