Текущая версия |
Ваш текст |
Строка 16: |
Строка 16: |
|
| |
|
| == Реализация == | | == Реализация == |
| В [[Каллисто|Каллисто 1.0]] примитив (FIND) сперва ищет слово в [[Память двоичных данных|памяти данных]], а затем в [[Память программ|памяти программ]]:
| |
| <pre>
| |
| 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
| |
| </pre>
| |
| === Советская реализация ===
| |
| Слово (FIND) в ФОРТ-ЕС было [[примитив]]ом и устроено сложнее, чем в [[Каллисто]] и fig-Форте. Вот его описание и определение: | | Слово (FIND) в ФОРТ-ЕС было [[примитив]]ом и устроено сложнее, чем в [[Каллисто]] и fig-Форте. Вот его описание и определение: |
| <PRE> | | <PRE> |