(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.

Реализация

Слово (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

Ссылки


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


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