Гость писал(а):
А как быть, если в тексте нужен символ ";"?
Можно использовать не клавиатурный символ.
В определении больших строк я сделал ошибку - применил 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 слова, например, табличным способом, или например пристегнув адрес кода через пробел к имени слова в длинной строке(вариантов много-надо выбрать оптимальный), что в конечном итоге
приведет к ускорению компиляции программы из исходников на лету.