|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 24, 2004 16:45:44 Слова почти в любом порядке. Каким способом найти определенные слова и по нахождению выполнять опред. кусок кода. Мой вариант: Нужные слова записываются в строку перед и каждым словом ставится цифра размера слова и номер: slova db 8,1,'typedef ',7,2,'define ',2,3,'if ',5,4,'ifdef ',6,5,'ifndef ',......,0,0 по номеру вычисляются соотв ссылки кода. Хоть оно и работает, но я еще чайник и не уверен что это правильный алгоритм. Есть ли общеизвестные алгоритмы ? Размер не важен, скорость важна очень. |
|
|
Дата: Окт 25, 2004 04:36:54 · Поправил: S_T_A_S_ Для скорости лучше хранить не номера ссылок кода, а непосредственно адруса ф-ций-обработчиков. Ещё можно все токены выровнять по 8, 12 или ?? байт (в зависимости от максимально длинного) Посмотри здесь, я приводил код для поиска относительно длинных токенов. название топика пусть не смущает, тот код адаптирован как раз из парсера, его немного подправить нужно только. Вообще, зависит от решаемой задачи. Если ты делаешь некий Си препроцессор (хотя тогда не понятно, зачем 'typedef'), то 8 символов вполне достаточно, и можно использовать регистры mmx, тогда код будет проще. Вот вариант с использованием команд SSE: (токены лучше отсортировать по вероятности нахождения в тексте)
preprocessor_directives:
db "define",0,0
dd preprocessor_directive_define
db "ifdef",0,0,0
dd preprocessor_directive_ifdef
db "endif",0,0,0
dd preprocessor_directive_endif
db "ifndef",0,0
dd preprocessor_directive_ifndef
..............
dd 0; таблица завершена
; EAX = кол-во символов в токене (его можно определить, найдя whitespace после букв)
; ESI = указатель на начало токена
neg AL
add AL,8
shl EAX,3
movd mm0,EAX
pcmpeqd mm1,mm1
psrlq mm1,mm0
movq mm0,mm1
pand mm1,QWORD[ESI]
mov ECX,preprocessor_directives
preprosessor_directive_search:
cmp DWORD[ECX],0
jz preprocessor_directive_unrecognized
movq mm2,QWORD[ECX]
add ECX,12
pcmpeqd mm2,mm1
packssdw mm2,mm2
movd EAX,mm2
inc EAX
jnz preprosessor_directive_search
jmp DWORD[ECX-4]
|
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.052 |