(FIND)

Материал из ПМК вики
Перейти к: навигация, поиск

(FIND) — архаичное слово Каллисто.

(FIND)         ( a1 a2 −− a3 c 1 | 0 )              Поиск слова a1 в словаре a2. Если найдено,
                                                    вернуть nfa и байт счётчика.

Искать слово a1 в наборе слов a2. При успехе дать NFA его статьи и c - байт длины с флагами.

Ввод слова (FIND)[править]

В режиме NUM последовательно нажмите клавиши $\mathrm{\overset{\rightarrow}{ШГ}}$    Р-ГРД-Г   П   7   4   K     P  $\mathrm{\overset{\leftarrow}{ШГ}}$

(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

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Stub-icon-48px.png Это заготовка статьи. Вы можете помочь проекту, дополнив её.