Уроки Iczelion'а




Урок 35. Подсветка синтаксиса в RichEdit - часть 8


&nbsp Затем нам требуется подсветить комментарии и убрать их с нашего пути. Мой метод состоит в поиске ";" и подсветке текста цветом комментария, пока не будет достигнут перевод каретки. Я не будут анализировать здесь эту процедуру: она довольно длинна и сложна. Достаточно сказать, что когда подсвечены все комментарии, мы замещаем их нулями в нашем буфере, чтобы слова в комментарии не обрабатывались позже.

mov ecx,BufferSize lea esi,buffer .while ecx>0 mov al,byte ptr [esi] .if al==" " || al==0Dh || al=="/" || al=="," || al=="|" || \ al=="+" || al=="-" || al=="*" || al=="&" || al=="<" \ || al==">" || al=="=" || al=="(" || al==")" || al=="{" \ || al=="}" || al=="[" || al=="]" || al=="^" || al==":" \ || al==9 mov byte ptr [esi],0 .endif dec ecx inc esi .endw

&nbsp Как только мы избавились от комментариев, мы разделяем слова в буфере, замещая символы "разделения" нулями. С помощью этого метода нам не нужно заботиться о символах разделения во время обработки слов в дальнейшем, так как у нас будет только один символ разделения.

lea esi,buffer mov ecx,BufferSize .while ecx>0 mov al,byte ptr [esi] .if al!=0

&nbsp Ищем в буфере первый символ, не равный NULL, т.е. первый символ слова.

push ecx invoke lstrlen,esi push eax mov edx,eax

&nbsp Получаем длину слова и помещаем его в edx.

movzx eax,byte ptr [esi] .if al>="A" && al<="Z" sub al,"A" add al,"a" .endif

&nbsp Конвертируем символ в нижний регистр (если он в верхнем).

shl eax,2 add eax,edi ; edi содержит указатель на массив указателей ; на структуры WORDINFO .if dword ptr [eax]!=0

&nbsp После этого мы переходим к соответствующему dword'у в ASMSyntaxArray и проверяем равно ли его значение 0. Если это так, мы можем перейти к следующему слову.




Содержание  Назад  Вперед