(FIND)
(FIND) — архаичное слово Каллисто.
(FIND) ( a1 a2 −− a3 c 1 | 0 ) Поиск слова a1 в словаре a2. Если найдено, вернуть nfa и байт счётчика.
Искать слово a1 в наборе слов a2. При успехе дать NFA его статьи и c - байт длины с флагами.
Ввод слова (FIND)
В режиме NUM последовательно нажмите клавиши ШГ→ Р-ГРД-Г П 7 4 K P ШГ←
(FIND) в fig-FORTH Release 1 glossary, май 1979 (англ.)
(FIND) addr1 addr2 --- pfa b tf (ok) addr1 addr2 .--- ff (bad) Searches the dictionary starting at the name field address addr2, matching to the text at addr1. Returns parameter field address, length byte of name field and boolean true for a good match. If no match is found, only a boolean false is left.
Реализация
В Каллисто 1.0 примитив (FIND) сперва ищет слово в памяти данных, а затем в памяти программ:
739 ;#xFIND 740 ; (FIND) ( a1 a2 −− a3 c 1 | 0 ) Поиск слова a1 в словаре a2. Если найдено, вернуть nfa и байт счётчика. 741 ; Адрес_строки NFA => NFA длина TRUE/FALSE 742 ; В отличии от Форта ИТЭФ мы возвращаем NFA 743 ; a1 адрес строки со счётчиком −− слово, которое мы ищем (пока только в байтовой области) 744 ; a2 NFA первого слова в начале списка слов, где мы ищем 745 ; a3 NFA найденного слова в списке 746 ; c байт длины и флагов найденого в списке слова 747 ; Сделать поиск и сравнение по словам 748 ; 749 ; Здесь в качестве истины возвращается 1, хотя Каллисто перешло на стандарт −1/0 750 LPFIND: .DB 6 751 .TEXT "(FIND)" ; ( a1 a2 −− a3 c 1 | 0 ) 752 .DW LBRAN 753 PFIND: .DW JPFIND 754 JPFIND: 755 ; Сперва поиск в памяти данных 756 RM3 MA 1 + M3 757 PKRM03 1 EE 4 − MB ; RB адрес слова, которое мы ищем (строка со счётчиком) 758 KRMB M0 ; R0 Длина слова, которое мы ищем 759 RMB 1 + MB ; RB адрес первой литеры слова, который мы ищем 760 KRMA 761 DFAST: M5 1 EE 4 − FX>=0 PFIND2 762 MA M5 ; RA=M5 адрес NFA слова в списке слов, с которым сравниваем 763 KRMA PKM03 63 KAND ; TOS байт длины и флагов очередного слова из списка 764 RM0 − FX=0 DSKIP ; Если длины и флаг SMUDGE различны, пропустить слово 765 KRM5 KRMB − FX!=0 SLO ; Если ещё и первые литеры равны, сравнить слова подробней 766 DSKIP: PKRM03 31 KAND RMA + M5 767 KRM5 RME ∗ KRM5 + FX=0 DFAST ; LFA, Смотреть след. слово 768 PKM03 KGOTO9 ; Не нашли, в RX уже 0 769 SLO: RM0 M1 RMB M5 RMA 1 + M4 GOTO SLOIN 770 SLOL: KRM4 KRM5 − FX=0 DSKIP 771 SLOIN: FL1 SLOL 772 PKRM03 RMA 1 EE 4 + 773 PGOTO PFTAIL ; NFA, нашли! 774 775 ; Если слово не найдено, поиск в памяти программ 776 PFIND2: RM5 777 FAST: MA ; RA адрес NFA слова в списке слов, с которым сравниваем 778 KPRGM PKM03 63 KAND ; TOS байт длины и флагов очередного слова из списка 779 RM0 − FX=0 SKIP ; Если длины и флаг SMUDGE различны, пропустить слово 780 RMA 1 + KPRGM KRMB − PX!=0 SLOW ; Если ещё и первые литеры равны, сравнить слова подробней 781 SKIP: PKRM03 31 KAND 1 + RMA + 782 KPRGM FANS 1 + KPRGM 783 <−> RME ∗ + PX=0 FAST ; LFA, Смотреть след. слово 784 PKM03 KGOTO9 ; Не нашли, в RX уже 0 785 SLOW: RM0 M1 RMB M5 RMA 1 + GOTO SLOWIN 786 SLOWL: 1 + M8 ; R8 следующая литера 787 KPRGM KRM5 − PX=0 SKIP 788 RM8 789 SLOWIN: FL1 SLOWL 790 PKRM03 RMA 791 PFTAIL: PKM03 ; NFA, нашли! 792 <−> KM3 ; c 793 1 KM3 KGOTO9 ; 1
Советская реализация
Слово (FIND) в ФОРТ-ЕС было примитивом и устроено сложнее, чем в Каллисто и fig-Форте. Вот его описание и определение:
(FIND) * -1,AN,,,A1,T->CFA,C,TF/FF ИСКАТЬ СЛОВО T 34 В СПИСКАХ A1,,,AN ПРИ УСПЕХЕ ДАТЬ CFA ЕГО СТАТЬИ И C - БАЙТ ДЛИНЫ С ПРИЗНАКАМИ Экран номер 34 ( 31.03.86 (FIND/ ) CODE (FIND) ( -1,AN,..,,A1,Т->СFA,С,TF/FF ) RW2 POP, RW2 RMASK NR, RW2 RFORTH AR, ( ОБРАЗЕЦ) 0 0 SR, 0 0 (, 0 RW2 IC, 0 LENG1MSK N, ( ДЛИНА) 1 1 SR, 1 0 BCTR, BEGIN, RW1 PULL, ( ВХОД В ОЧЕРЕДНОЙ СПИСОК СЛОВ) 2 =F В, BEGIN, RW1 RFORTH AR, 14 0 (, 0 RW1 IC, 14 LEHGMASK N, 14 0 CR, ?E IF, 14 4 =F EX, 3 =F BE, THEN, 14 LENG1MSK N, RW1 2 (, 14 RW1 LH, 2 =H RW1 RMASK NR, ?Z UNTIL, RSTACK RTWO AR, 1 FIRST CH, ?E UNTIL, PUTRW1 B, BEGIN, RSTACK RTWO AR, 3 =H 1 FIRST CH, ?E UNTIL, 0 0 (, 0 RW1 IC, RW1 RFORTH SR, RW1 4 (, 14 RW1 LA, RW1 PUT, 0 PUSH, RW1 1 LR, PUSHRW1 B, 4 =H 1 (, 1 RW1 ), 1 (, RW2 CLC, END-CODE
В FORTH ИТЭФ слово (FIND) тоже было примитивом, вот его определение:
HEAD 206Q,'(FIND',251Q,PFIND ; PFIND ; Адрес строки NFA => PFA длина TRUE/FALSE POP AX POP CX PUSH BP ; сохранение содержимого регистров PUSH SI PUSH DI MOV SI, CX SUB BP, BP MOV DI, AX MOV DX,WORD PTR [SI] AND DX, 77577Q CLD ; DF=0 (вперед) FAST: MOV CX,WORD PTR [DI] AND CX, 77477Q CMP DX, CX JE SLOW MATCH: CMP WORD PTR [DI], 0 JS $SIG ; BPL INC DI JMP MATCH $SIG: ADD DI, 2 CMP WORD PTR [DI],0 JE FAIL MOV DI,WORD PTR [DI] JMP FAST SLOW: MOV BP,WORD PTR [DI] MOV BX, SI JMP SLOW1 $LOOP: INC BX MOV AX,WORD PTR [BX] MOV CX,WORD PTR [DI] AND CX, 77777Q CMP AX, CX JNE MATCH SLOW1! INC DI TEST WORD PTR -1[DI],100000Q JE $LOOP MOV DX, BP ADD DI, 5 HOV AX, DI POP DI ; восстановление содержимого регистров POP SI POP BP SUB AX, 2 PUSH AX AND DX, 377Q ; байт длины PUSH DX ; в стек JMP TRUE ; Установка флага "Найдено" FAIL: POP DI POP SI POP BP JMP FALSE
Ссылки
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |