home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
Geneve
/
9640news
/
CAT17
/
TREE.ARK
< prev
next >
Wrap
Text File
|
2006-10-19
|
3KB
|
79 lines
?
( STRUCTURE TREE UTILITY 831 BYTES )
( To load: 90 LOAD )
( TREE Usage: To list Structure Tree of word XYZ: )
( TREE XYZ )
0 VARIABLE LEVEL ( Current level of TREE branch )
10 VARIABLE MAX-LEVEL ( Maximum TREE branch level )
: NULL ; ( Dummy def to get : cfa value )
' NULL CFA @ CONSTANT COLON ( Pointer to code of : word )
' ;S CFA CONSTANT SEMICOLON ( Terminating CFA of : word )
' 0BRANCH CFA CONSTANT '0BRANCH ( Words compiling arguments )
' BRANCH CFA CONSTANT 'BRANCH
' LIT CFA CONSTANT 'LIT
' (LOOP) CFA CONSTANT 'LOOP
' (+LOOP) CFA CONSTANT '+LOOP
' (.") CFA CONSTANT '"
-->
( STRUCTURE TREE UTILITY cont. PAGE-2 )
( DRAW BAR FOR CURRENT LEVEL )
: BAR -DUP IF 0 DO 95 EMIT LOOP ENDIF ;
( CASE STATEMENT BY DR. C. E. EAKER )
: DOCASE ?COMP CSP @ !CSP 4 ; IMMEDIATE
: << 4 ?PAIRS COMPILE OVER COMPILE = COMPILE 0BRANCH
HERE 0 , COMPILE DROP 5 ; IMMEDIATE
: >> 5 ?PAIRS COMPILE BRANCH HERE 0 ,
SWAP 2 [COMPILE] ENDIF 4 ; IMMEDIATE
: ENDCASES 4 ?PAIRS COMPILE DROP
BEGIN SP@ CSP @ = 0= WHILE
2 [COMPILE] ENDIF REPEAT CSP ! ; IMMEDIATE
-->
( STRUCTURE TREE UTILITY cont. PAGE-3 )
( PRINT THE ARGUMENT )
: PRINT-ARG DOCASE
1 << 2 + DUP C@ . 1 + >> ( Skip/print 1 byte )
2 << 2 + DUP @ . 2 + >> ( Skip/print 2 bytes )
3 << 2 + DUP C@ SWAP 1+ SWAP ( Skip/print n bytes )
0 DO DUP C@ EMIT 1+ LOOP >> ( Print string )
ENDCASES ;
( MOVE PFA ON STACK TO NEXT WORD, addr --- addr+offset )
: MOVE-WORD DUP @ DOCASE ( Get cfa compiled at ptr, check: )
'0BRANCH << 2 PRINT-ARG >> 'BRANCH << 2 PRINT-ARG >>
'LIT << 2 PRINT-ARG >>
'LOOP << 2 PRINT-ARG >> '+LOOP << 2 PRINT-ARG >>
'" << 3 PRINT-ARG >> ( Skip string till " )
SWAP 2 + SWAP ENDCASES ; ( Skip only the ptr itself )
-->
( STRUCTURE TREE UTILITY cont. PAGE-4 )
( PRINT THE NAME WHOSE CFA IS POINTED TO BY STACK ADDR )
: PRINT-NAME ( addr--- )
CR LEVEL @ 3 .R LEVEL @ 3 * BAR ( Print level # & bar )
@ 2 + NFA ID. ( get cfa>pfa>nfa & print name )
?KEY IF KEY DROP ENDIF ;
( PRINT WORD TREE )
: DO-TREE ( pfa--- )
1 LEVEL ! BEGIN ( Init level, do till stack empty )
?TERMINAL IF ABORT ENDIF ( Abort if key is pressed )
DUP @ SEMICOLON = 0= IF ( If not at an ;S word )
DUP PRINT-NAME DUP @ @ COLON = ( Print if lower word is )
LEVEL @ MAX-LEVEL @ < AND ( a : def & < MAX-LEVEL )
OVER @ FENCE @ > AND IF ( & > fence )
1 LEVEL +! DUP @ 2 + ( Get pfa of next level down )
-->
( STRUCTURE TREE UTILITY cont. PAGE-5 )
( PRINT WORD TREE cont. )
ELSE MOVE-WORD ENDIF ( Not a colon, move to next )
ELSE -1 LEVEL +! ( End of colon def, pop up next lvl )
DROP MOVE-WORD ENDIF ( Drop addr pointer & move over )
LEVEL @ 0= UNTIL ; ( Until stack is empty )
( USER ENTRY FOR TREE )
: TREE CR [COMPILE] ' ( Get pfa of next input word )
DUP NFA ID. ( Print word to be TREEd )
DO-TREE CR ; ( Print Structure Tree of pfa )
;S
Download complete. Turn off Capture File.