Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 13:52

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - слова-строки
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
Гость писал(а):
А как быть, если в тексте нужен символ ";"?

Можно использовать не клавиатурный символ.
В определении больших строк я сделал ошибку - применил JMP REL8, а надо JMP REL32.
Правильно будет так:
Код:
: T: ( name "text" -- )
: 5 ALLOT DP @ >R
BEGIN
  NextWord 2DUP 1 = IF
  C@ [CHAR] • =      IF
  2DROP 1            ELSE
  OVER C@ [CHAR] \ =  IF
  DROP 0xD PARSE
  DROP OVER - BL FILL  ELSE
  LEX+                THEN 0
                     THEN
                    ELSE
  DROP DUP 0=        IF
  2DROP REFILL DROP  ELSE
  LEX+               THEN 0
                    THEN
UNTIL
DP @ R@ 5 - DP ! 0xE9 C, DUP R@ - ,
DUP DP ! R@ SWAP R> - DLIT,
POSTPONE ;
;

Попробовал длинные строки на предмет другой техники поиска слов в словарях.
Код:
T: TWORDS \ имена слов словаря FORTH
DONE           INIT           (INIT)         SPF-INIT?      ;..
..:            ...            SPF-INI        TITLE          (TITLE)
FATAL-HANDLER1 EXC-DUMP1      DUMP-TRACE-SHRUNKEN
TRACE-TAIL-SIZE               TRACE-HEAD-SIZE               DUMP-TRACE
AT-EXC-DUMP    STACK-ADDR.    IN-EXCEPTION   USER-EXIT      PROCESS-INIT
ERR-EXIT       USER-INIT      POOL-INIT      AT-PROCESS-STARTING
AT-THREAD-STARTING            ALIGN-BYTES-CONSTANT          MAINX
OPTIONS        (OPTIONS)      COMMANDLINE-OPTIONS
SUBSTRING-OPTIONS             SAVE           RESOURCES-SIZE RESOURCES-RVA
IMAGE-BASE     IMAGE-SIZE     IMAGE-BEGIN    ORG-ADDR       CGI-OPTIONS
POST?          CGI?           TERMINATE      PAUSE          STOP
RESUME         SUSPEND        START          ERASE-IMPORTS  TASK:
TASK           WNDPROC:       CALLBACK:      EXTERN         WINAPI:
__WIN:         NEW-WINAPI?    WINAPLINK      OEM>ANSI       ANSI>OEM
PROC-ERROR1    LIB-ERROR1     ERROR2         DECODE-ERROR   (DECODE-ERROR)
FORTH_ERROR    ENVIRONMENT?   (ENVIR?)       EXECUTE        ?DUP
RDROP          >R             R>             }}             {{
;MODULE        EXPORT         MODULE:        UNLOOP         LEAVE
I              +LOOP          LOOP           ?DO            DO
RECURSE        AGAIN          REPEAT         WHILE          UNTIL
BEGIN          THEN           ELSE           IF             ?LITERAL2
?SLITERAL2     HEX-SLITERAL   ?LITERAL1      ?SLITERAL1     [']
ABORT"         [CHAR]         ."             C"             S"
CLITERAL       SLITERAL       2LITERAL       LITERAL        --
FIELD          \EOF           EXIT           ;              [COMPILE]
(              .(             \              POSTPONE       TO
:              :NONAME        HIDE           SMUDGE         C-SMUDGE
BEHAVIOR!      BEHAVIOR       ->VECT         USER-VECT      USER-VALUE
USER           USER-CREATE    USER-ALIGNED   ->VARIABLE     VECT
VALUE          CONSTANT       VARIABLE       VOCABULARY     DOES>
(DOES2)        (DOES1)        CREATE         CREATED        HEADER
SHEADER1       SHEADER        LAST-NON       LAST-CFA       REQUIRE
REQUIRED       INCLUDED       INCLUDED_STD   INCLUDE-DEPTH  (INCLUDED1)
(INCLUDED)     INCLUDE-PROBE  INCLUDE-FILE   TranslateFlow  FIND-FULLNAME1
FIND-FULLNAME  HEAP-COPY      RECEIVE-WITH   RECEIVE-WITH-XT
PROCESS-ERR1   PROCESS-ERR    EVALUATE       EVALUATE-WITH  RESTORE-SOURCE
SAVE-SOURCE    QUIT           MAIN1          ]              [
OK1            .SN            #(SIGNED)      INTERPRET      &INTERPRET
INTERPRET_     NOTFOUND       EVAL-WORD      BYE            CHAR
'              WORD           ?COMP          ?STACK         DEPTH
?SLITERAL      ?LITERAL       <MAIN>         OK             BLK
STATE          WARNING        R0             S0             SAVE-ERR
(ABORT1")      ?ERROR         LAST-WORD      ERR-STRING     ERR-FILE
ERR-LINE       ERR-IN#        ERR-LINE#      ERR-NUMBER     NOTSEEN-ERR
SEEN-ERR       SEEN-ERR?      ERR-DATA       /err-data      err.file
err.line       err.notseen    err.in#        err.line#      err.number
/errstr_       ER-U           ER-A           (ABORT")       ERROR
WORDS          NLIST          W-CNT          >OUT           LATEST
ORDER          VOC-NAME.      PREVIOUS       ALSO           SET-ORDER
ONLY           FORTH          GET-ORDER      DEFINITIONS    FIND1
SFIND          CONTEXT        S-O            SEARCH-WORDLIST1
SEARCH-WORDLIST-NFA           CDR-BY-NAME    SEARCH-WORDLIST
FIND           NEAR_NFA       WordByAddr     (WordByAddr)   (NEAREST-NFA)
(NEAREST3)     (NEAREST2)     (NEAREST1)     FOR-WORDLIST
ENUM-VOCS-FORTH               (ENUM-VOCS-FORTH)             ENUM-VOCS
IS-CLASS-FORTH VOC            IMMEDIATE      ?VOC           ?IMMEDIATE
IS-VOC         IS-IMMEDIATE   ID.            CDR            NAME>L
NAME>F         NAME>C         NAME>          WID-EXTRA      PAR@
PAR!           CLASS@         CLASS!         FREE-WORDLIST  TEMP-WORDLIST
WORDLIST       AT-WORDLIST-CREATING          BUILD-DATE     VERSION
WL_SIZE        +WORD          +SWORD         >BODY          FORTH-WORDLIST
&VOC           &IMMEDIATE     LAST           VOC-LIST       _VOC-LIST
ALIGN-NOP      ALIGN          ALIGNED        ALIGN-TO       ALIGN-BYTES
>RESOLVE       >RESOLVE1      >ORESOLVE      >ORESOLVE1     <MARK
>MARK          ",             SLIT,          S",            S,
?BRANCH,       RLIT,          DLIT,          LIT,           RET,
BRANCH,        COMPILE,       _COMPILE,      HERE           RESOLVE_OPT
J_OPT?         J_MOVE         J_+!           J?_STEP        CON>LIT
FORLIT,        OPT            ???BR-OPT      ??BR-OPT       ?BR-OPT
BR-EVEN-EAX    ?BR-OPT-RULES  MACRO,         INLINE,        OPT_INIT
OPT_CLOSE      XC_J           _INLINE,       2A_,_STEP      1A_,_STEP
0A_,_STEP      A_,_STEP       7_,_STEP       6_,_STEP       5_,_STEP
4_,_STEP       4_,_STEP_      3_,_STEP       2_,_STEP       1_,_STEP
+EBP           MACRO?         INLINE?        DO_OPT         OPT_
-EVEN-EBP      OPT-RULES      ?C-JMP         ?EAX=RULES     FPOP
DO_EAX>ECX     ?EAX:=ECX      EBX:=EAX       ECX:=EAX       F?EAX>ECX
T?EAX>ECX      -EBPCLR        -EBPLIT        EAX>ECX        EAX>ECX0
?EAX>ECX       EAX>EBX        EAX>EBX0       ?EAX>EBX       }?~EAX
?~EAX{         SAVE-?~EAX     ?~EAX          OPinsert       OPresize
MOV_EDX_[EBP]  ?EDX_[EBP]     XX_STEP        ?OPlast        OPexcise
OP_SIZE        ^?EAX=         ?ChEAX         DUP7B?         DUP5B?
DUP6B?         DUP2B?         DUP3B?         DUP3B?[EBP]
ADD|XOR|OR|AND=               +>OFF-EBP      EVEN-EBP       EVEN-EAX
MACROOPT-WL    SHORT?         ?SET           SetJP          J_@
SJ@            J@             ClearJpBuff    INIT-MACROOPT-LIGHT
JP4            JP3            JP2            JP1            JP0
JpBuffSize     ToOP0          SetOP          OPLast         OP8
OP7            OP6            OP5            OP4            OP3
OP2            OP1            OP0            OpBuffSize     LAST-HERE
J-SET          :-SET          OFF-EAX        OFF-EBP        MM_SIZE
DIS-OPT        SET-OPT        J_COD          ~BR-OPT        OPT?
REL@           W,             C,             ,              ALLOT
DP             IS-TEMP-WL     GET-CURRENT    SET-CURRENT    DOES>A
CFL            (DP)           CURRENT        NON-OPT-WL     REFILL-SOURCE
REFILL-FILE    FREFILL        REFILL-STDIN   TAKEN-TIB      REFILL
CONSOLE-HANDLES               ?CONSOLE       ?GUI           CURSTR
<PRE>          SOURCE-ID-XT   SOURCE-ID      SKIP1          SKIP
PSKIP          PARSE          PARSE-NAME     NextWord       ParseWord
SkipUpTo       SkipWord       OnNotDelimiter SkipDelimiters OnDelimiter
GetChar        IsDelimiter    IsDelimiter1   PeekChar       CharAddr
EndOfChunk     SOURCE!        SOURCE         DDATA          DDP
ATIB           TIB            C/L            >IN            #TIB
SOURCE-NAME    +LibraryDirName               +ModuleDirName ModuleDirName
ModuleName     CUT-PATH       is_path_delimiter             CURFILE
SCREEN-LENGTH  >NUMBER        (.")           DUMP           PTYPE
>PRT           .TO-LOG        .0             U.             .
D.             (D.)           SIGN           #>             #S
#              <#             HOLDS          HOLD           DECIMAL
HEX            PAD            SYSTEM-PAD     NUMERIC-OUTPUT-LENGTH
BASE           HLD            KEY1           KEY            KEY?
PENDING-CHAR   SPACES         SPACE          BL             EKEY>SCAN
EKEY>CHAR      EKEY           KEY_EVENT      ControlKeysMask
INPUT_RECORD   EKEY?          CR             EMIT           TYPE1
TYPE           ACCEPT1        ACCEPT         TO-LOG         STARTLOG
ENDLOG         ANSI><OEM      FILE-EXIST     FLUSH-FILE     WRITE-LINE
RESIZE-FILE    WRITE-FILE     lpNumberOfBytesWritten        READ-LINE
_addr          _fp2           _fp1           EOLN           UNIX-LINES
DOS-LINES      LTL            LT             REPOSITION-FILE
READ-FILE      lpNumberOfBytesRead           OPEN-FILE      FILE-SIZE
FILE-POSITION  lpDistanceToMoveHigh          DELETE-FILE
OPEN-FILE-SHARED              CREATE-FILE-SHARED            SA
CREATE-FILE    CLOSE-FILE     SET-EXC-HANDLER
DROP-EXC-HANDLER              (EXC)          <EXC-DUMP>     EXC-HANDLER
HALT           AT-PROCESS-FINISHING          AT-THREAD-FINISHING
H-STDLOG       H-STDERR       H-STDOUT       H-STDIN        ABORT
CATCH          <SET-EXC-HANDLER>             THROW          FATAL-HANDLER
HANDLER        RESIZE         FREE           ALLOCATE       DESTROY-HEAP
CREATE-PROCESS-HEAP           CREATE-HEAP    SET-HEAP       EXTRA-MEM
USER-HERE      USER-ALLOT     ERR            USER-OFFS      THREAD-HEAP
R/W            W/O            R/O            FILE_CURRENT   FILE_BEGIN
OPEN_EXISTING  CREATE_ALWAYS  FILE_ATTRIBUTE_ARCHIVE
INVALID_HANDLE_VALUE          MEM_RESERVE    MEM_COMMIT
PAGE_EXECUTE_READWRITE        FlushFileBuffers              Sleep
TerminateThread               ResumeThread   SuspendThread  CreateThread
GetEnvironmentVariableA       GetModuleFileNameA            OemToCharBuffA
CharToOemBuffA GetProcAddress LoadLibraryA   GetCommandLineA
HeapReAlloc    HeapFree       HeapAlloc      HeapDestroy    HeapCreate
GetProcessHeap ReadConsoleInputA             GetNumberOfConsoleInputEvents
ExitThread     ExitProcess    SetEndOfFile   WriteFile      ReadFile
GetFileSize    SetFilePointer DeleteFileA    CreateFileA    CloseHandle
GetFileAttributesA            GetLastError   GetStdHandle
<FORTH-INSTANCE               FORTH-INSTANCE>               _WNDPROC-CODE
_WINAPI-CODE   API-CALL       AO_INI         LIB-ERROR      PROC-ERROR
ST-RES         AOGPA          AOLL           DOES-CODE      HASH
DABS           ERASE          MOVE           >CELLS         >CHARS
CHARS          CHAR-          CHAR+          */             CELL
TRUE           FALSE          FNOP           _FLIT-CODE10   _FLIT-CODE8
`F1-           F**2           `F1+           FD>            FD<
FRSTOR         FSAVE          FENV>          F>ENV          F10/
F10*           F>D            F>D            LOW-MODE       UP-MODE
ROUND-MODE     TRUNC-MODE     F[LOG]         FLOG2          GETFPUSW
F--DS          F>DS           DS>F           GETFPUCW       SETFPUCW
FINIT          F>RAD          F>DEG          FASIN          FACOS
FATAN2         FATAN          FTAN           F**            FEXPM1
FEXP           FLOG           FLNP1          FLN            SF@
SF!            F@             DATA>FLOAT32   FLOAT>DATA32   DATA>FLOAT
FLOAT>DATA     F!             DF@            DF!            D>F
F1+            FDEPTH         FROT           FSWAP          FINT
FOVER          FDUP           FDROP          FSQRT          F/
F-             F+             F*             FABS           FSINCOS
FSIN           FCOS           FNEGATE        FMIN           FMAX
F=             F<             F0<            F0=            1.E
.E             FL2E           FL2T           FLN2           FLG2
FPI            10.E           2.E            (ENTER)        TRAP-CODE
TIMER@         (LocalsExit)   RFREE          (RALLOT)       RALLOT
RP+!           RP+            RP+@           NRCOPY         N>R
NR>            DRMOVE         C-EXECUTE      C-?DUP         C-RDROP
C-R>           C->R           C-I            ADD[ESP],EAX   C-?DO
C-DO           J              FS!            FS@            TlsIndex@
TlsIndex!      RP@            SP@            RP!            SP!
ASCIIZ>        FILL           CMOVE>         CMOVE          SEARCH
COMPARE        -TRAILING      D2/            D2*            D=
D0=            0<>            0=             0<             U>
U<             D>             D<             WITHIN         >
<              <>             =              DIGIT          FM/MOD
SM/REM         ARSHIFT        RSHIFT         LSHIFT         M*
*/MOD          U2/            2/             UM/MOD         UMOD
/MOD           MOD            +!             U/             /
UM*            C>S            U>D            D>S            S>D
NOOP           DNEGATE        ABS            NEGATE         INVERT
XOR            OR             AND            *              COUNT
0!             1+!            -              D-             D+
CELLS          CELL-          CELL+          +              2*
2-             2+             1-             1+             2!
2@             W!             W@             C!             C@
!              @              2R@            R@             2R>
2>R            TUCK           ROLL           PICK           -ROT
ROT            NIP            2OVER          OVER           2SWAP
SWAP           2DROP          0MAX           UMIN           UMAX
MIN            MAX            DROP           2DUP           DUP
TOUSER-VALUE-CODE             USER-VALUE-CODE               TOVALUE-CODE
CONSTANT-CODE  USER-CODE      CREATE-CODE    _---CODE       CLITERAL-CODE
_CLITERAL-CODE SLITERAL-CODE  _TLITERAL-CODE _SLITERAL-CODE
_TOUSER-VALUE-CODE            _TOVALUE-CODE  _VECT-CODE
_USER-VECT-CODE               _USER-VALUE-CODE              USER+
_USER-CODE     _CONSTANT-CODE _CREATE-CODE

: TW-1  S" INIT" ;                     : W-1  S"  INIT " ;
: TW-2  S" (INIT)" ;                   : W-2  S"  (INIT) " ;
: TW-3  S" SPF-INIT?" ;                : W-3  S"  SPF-INIT? " ;
: TW-4  S" ;.." ;                      : W-4  S"  ;.. " ;
: TW-5  S" ..:" ;                      : W-5  S"  ..: " ;
: TW-6  S" SPF-INI" ;                  : W-6  S"  SPF-INI " ;
: TW-7  S" TITLE" ;                    : W-7  S"  TITLE " ;
: TW-8  S" (TITLE)" ;                  : W-8  S"  (TITLE) " ;
: TW-9  S" FATAL-HANDLER1" ;           : W-9  S"  FATAL-HANDLER1" ;
: TW-10 S" DUMP-TRACE-SHRUNKEN" ;      : W-10 S"  DUMP-TRACE-SHRUNKEN " ;
: TW-11 S" TRACE-TAIL-SIZE" ;          : W-11 S"  TRACE-TAIL-SIZE " ;
: TW-12 S" TRACE-HEAD-SIZE" ;          : W-12 S"  TRACE-HEAD-SIZE " ;
: TW-13 S" WARNING" ;                  : W-13 S"  WARNING " ;
: TW-14 S" _CREATE-CODE" ;             : W-14 S"  _CREATE-CODE " ;

: T-1   TW-1  SFIND ;   : dT-1  TWORDS W-1  SEARCH ;
: T-2   TW-2  SFIND ;   : dT-2  TWORDS W-2  SEARCH ;
: T-3   TW-3  SFIND ;   : dT-3  TWORDS W-3  SEARCH ;
: T-4   TW-4  SFIND ;   : dT-4  TWORDS W-4  SEARCH ;
: T-5   TW-5  SFIND ;   : dT-5  TWORDS W-5  SEARCH ;
: T-6   TW-6  SFIND ;   : dT-6  TWORDS W-6  SEARCH ;
: T-7   TW-7  SFIND ;   : dT-7  TWORDS W-7  SEARCH ;
: T-8   TW-8  SFIND ;   : dT-8  TWORDS W-8  SEARCH ;
: T-9   TW-9  SFIND ;   : dT-9  TWORDS W-9  SEARCH ;
: T-10  TW-10 SFIND ;   : dT-10 TWORDS W-10 SEARCH ;
: T-11  TW-11 SFIND ;   : dT-11 TWORDS W-11 SEARCH ;
: T-12  TW-12 SFIND ;   : dT-12 TWORDS W-12 SEARCH ;
: T-13  TW-13 SFIND ;   : dT-13 TWORDS W-13 SEARCH ;
: T-14  TW-14 SFIND ;   : dT-14 TWORDS W-14 SEARCH ;

REQUIRE METER ~CHESS\TASK\METER.F
STARTLOG
METER T-1  METER dT-1
METER T-2  METER dT-2
METER T-3  METER dT-3
METER T-4  METER dT-4
METER T-5  METER dT-5
METER T-6  METER dT-6
METER T-7  METER dT-7
METER T-8  METER dT-8
METER T-9  METER dT-9
METER T-10 METER dT-10
METER T-11 METER dT-11
METER T-12 METER dT-12
METER T-13 METER dT-13
METER T-14 METER dT-14


ЛОГ

Код:
183843 180396
  387     207
176940 177093
   540    360
158805 160038
   729    504
177381 176733
   819    657
176922 176661
   999    783
198171 192960
  1278   1098
180414 180000
  1440   1197
194652 191682
  1566   1368
151677 153540
  1773   1584
152019 153396
  2115   1926
152280 154053
  2295   2142
152415 154089
  2529   2367
195615 192663
30996  30564
153990 155421
142452 154080
Ok


Заметно ускорение поиска(особенно для слов близких к вершине словаря).
Технику поиска имени слова в длинных строках имен слов словарей
можно усовершенствовать для все того же повышения скорости(SEARCH не совсем подходящий код для этого)
и выйти в итоге на получение xt слова, например, табличным способом, или например пристегнув адрес кода через пробел к имени слова в длинной строке(вариантов много-надо выбрать оптимальный), что в конечном итоге
приведет к ускорению компиляции программы из исходников на лету.
Сообщение Добавлено: Сб сен 06, 2008 11:11
  Заголовок сообщения:   Ответить с цитатой
нужно в исходнике передавать управляющие символы парой символов
как в С++ '\t' '\r' '\n' '\\' и т.д.
Сообщение Добавлено: Ср сен 03, 2008 01:07
  Заголовок сообщения:   Ответить с цитатой
А как быть, если в тексте нужен символ ";"?
Сообщение Добавлено: Ср сен 03, 2008 00:10
  Заголовок сообщения:   Ответить с цитатой
chess писал(а):
Вариантов много.

Вот еще один вариант реализации именованных больших строк - строка пишется сразу в словарную статью
без использования промежуточного буфера.
Если в определении слова T: слово DLIT, заменить на EVALUATE , то это уже будет определение макроса-шаблона.
Сами байты счетчика здесь не формируются - что-то необходимости в нем, что для строк, что для макросов, не видно.


Код:
: HEAD-JMP 0xEB C, ;
: MOVE-LEX DP @ SWAP DUP ALLOT MOVE 0 C, ;

\ слово резервирует 2 байта под код перехода на код выдающий адрес начала строки и ее длину,
\ запоминает адрес начала строки в кодофайле,
\ грузит строку в кодофайл и запоминает адрес конца строки
\ пишет код перехода в зарезервированные 2 байта
\ пишет сам код выдачи A U для загруженной строки и пишет RET

: T: : 2 ALLOT DP @ >R
BEGIN
  NextWord 2DUP 1 = IF
  C@ [CHAR] ; =          IF
  2DROP 1                ELSE
  OVER C@ [CHAR] \ =                IF
  DROP 0xD PARSE DROP OVER - 0 FILL ELSE
  MOVE-LEX                          THEN 0
                         THEN
                    ELSE
  DROP DUP 0=            IF
  2DROP REFILL DROP      ELSE
  MOVE-LEX               THEN 0
                    THEN
UNTIL
DP @ R@ 2- DP ! HEAD-JMP DUP R@ - C, DUP DP !
R@ SWAP R> - DLIT,
POSTPONE ;
;

\ EOF
T: S1
~!@#$%^ 1234 ABCDEFG  \ GJHGHJGJHGF
5 \\\\\   '''' 6      \ IOUIOYUITGUY

HH     KJKLJKL
O
;
STARTLOG
S1 TYPE

лог
Код:
~!@#$%^ 1234 ABCDEFG 5 \\\\\ '''' 6 HH KJKLJKL O
Ok
Сообщение Добавлено: Вт сен 02, 2008 20:36
  Заголовок сообщения:  слова-строки  Ответить с цитатой
Слова-строки (счетчик - 4 байта)
длина создаваемых строк ограничена размером промежуточного буфера - макс. размер буфера м.б. 2^31
годятся для SEARCH, EVALUATE и прочих синтаксических разборок.

Реализация:
Код:
: _TLITERAL-CODE  ( -- a2 u , где a2 - адрес начала строки в кодофайле, u - длина строки )
-8 P+    \ наращиваем стек на две ячейки
$ 4 @P=A \ сохраняем предыдущий tos
B=RS     \ снимаем адрес возврата с вершины стека возврата в EBX
A=@B     \ в tos кладем число по адресу возврата - это значение 4-х байтного счетчика (длина строки)
4 B+     \ обходим байты счетчика, увеличивая адрес возврата на 4
@P=B     \ под tos на стек кладем адрес первого байта строки
B=aBA    \ вычисляем новый адрес возврата путем добавки к адресу первого байта строки длины строки
1 B+     \ учитываем, что в конце строки будет 0-й завершающий байт - обходим его, увеличивая адрес возврата на 1
JRB      \ уходим по новому адресу возврата
-;

\ перемещает строку из адреса а1 в кодофайл по адресу a2
: TLIT, ( a1 u -- a2 u ) _TLITERAL-CODE, DUP , S, 0 C, ;

\ _TLITERAL-CODE, - такого слова нет, но есть _TLITERAL-CODE - т.е. запятая в конце
\ определенного в словаре слова приводит к трансляции (соответствующим NOTFOUND)
\ следующего текста: POSTPONE _TLITERAL-CODE

CREATE T-BUF 8000 ALLOT 0 VALUE T-DP
: T-BUF0 T-BUF 8000 0 FILL ;

\ слово name определенное через T: выдает a u - записанной в кодофайл строки "text"
\ причем символы перевода строк и возврата каретки в тексте затираются 0-мя, а лишние пробелы удаляются
: T:  ( name "text" -- a u)
: 0 TO T-DP T-BUF0
BEGIN NextWord 2DUP >R >R NIP DUP 1 =
IF DROP R@ C@ [CHAR] ; =
    IF RDROP RDROP T-BUF T-DP TLIT, POSTPONE ; 0 TO T-DP EXIT
    ELSE R@ C@ [CHAR] \ = IF R@ 0xD PARSE DROP R@ - 0 FILL THEN THEN
ELSE 0= IF REFILL DROP THEN THEN
R> T-BUF T-DP + R@ CMOVE> T-DP R> + 1+ TO T-DP T-DP 0=
UNTIL ;


Код:
\ EOF
T: WSTRING1
WORD1 WORD2 WORD3
..... \ ..... .....
WORD8 WORD9 WORD10
..... ..... !!   !
  T: NIP- 3\23 |;
..... ..... .....
WORD80 ..........
\ WORD90 ..........
WORD100
11111111111111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333333333333
44444444444444444444444444444444444444444444444444444444
55555555555555555555555555555555555555555555555555555555
;
T: WSTRING2
1234 877854
453465
ABCDEFGH
;
STARTLOG
SEE _TLITERAL-CODE

CR CR WSTRING1 TYPE
CR CR WSTRING2 TYPE


лог
Код:
CODE _TLITERAL-CODE (23 bytes)
5AD2B3 8D6DF8           LEA     EBP , F8 [EBP]
5AD2B6 894504           MOV     4 [EBP] , EAX
5AD2B9 5B               POP     EBX
5AD2BA 8B03             MOV     EAX , [EBX]
5AD2BC 8D5B04           LEA     EBX , 4 [EBX]
5AD2BF 895D00           MOV     0 [EBP] , EBX
5AD2C2 8D1C03           LEA     EBX , [EBX] [EAX]
5AD2C5 8D5B01           LEA     EBX , 1 [EBX]
5AD2C8 FFE3             JMP     EBX
END-CODE                (9 instructions)


WORD1 WORD2 WORD3  .....    WORD8 WORD9 WORD10  ..... ..... !! !  T: NIP- 3\23 |;  ..... ..... .....  WORD80 ..........     WORD100  11111111111111111111111111111111111111111111111111111111  22222222222222222222222222222222222222222222222222222222  33333333333333333333333333333333333333333333333333333333  44444444444444444444444444444444444444444444444444444444  55555555555555555555555555555555555555555555555555555555

1234 877854  453465  ABCDEFGH
Ok

Буфер можно делать в куче и удалять сразу после создания строк.
Слова _TLITERAL-CODE и TLIT, можно ввести в ядро.
Вариантов много.
Сообщение Добавлено: Ср авг 27, 2008 15:58

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB