· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.HELHEIM —› Поиск слов в тексте

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