\ 4tH library - ANS "CASE" to 4tH Converter - Copyright 2009 J.L. Bezemer
\ You can redistribute this file and/or modify it under
\ the terms of the GNU General Public License
include lib/parsname.4th \ for PARSE-NAME
include lib/row.4th \ for ROW
include lib/stack.4th \ for >A A>
32 constant #case \ depth of CASE stack
#case array case-stack \ CASE control stack
\ a few helper words
: tib@ tib >in @ chars + c@ ; ( -- c)
: eol? tib@ dup if space else cr then 0= ;
: ?emit dup bl < if drop else emit 1 >in +! then ;
: >delimiter >r type space r@ parse type r> ?emit ;
: case? case-stack adepth 0= abort" Missing CASE" ;
\ associated behavior
: >EOL 0 >delimiter ; \ with listed delimiters
: >) [char] ) >delimiter ;
: >" [char] " >delimiter ;
: >| [char] | >delimiter ;
: >] [char] | >delimiter ;
: >WHITE type space parse-name type ; \ set ELSE counter to zero
: >OF 2drop ." OVER = IF DROP" ; \ convert "OF" to "OVER = IF DROP"
: >ENDOF 2drop case? ." ELSE" case-stack a> 1+ case-stack >a ;
: >ENDCASE 2drop case? ." DROP" case-stack a> 0 ?do ." THEN" loop ;
: >CASE \ abort when nesting is too deep
2drop case-stack adepth #case -1 [+] = abort" Nesting too deep"
." ( CASE statement)" 0 case-stack >a
; \ put new counter on the stack
\ keywords with associated behaviors
create keyword
," \" ' >EOL ,
," (" ' >) ,
," #!" ' >EOL ,
,| ,"| ' >" ,
," ,|" ' >| ,
,| ."| ' >" ,
," .(" ' >) ,
," .|" ' >| ,
,| S"| ' >" ,
," S|" ' >| ,
," CHAR" ' >WHITE ,
," @GOTO" ' >EOL ,
," [NEEDS" ' >] ,
,| ABORT"| ' >" ,
," [CHAR]" ' >WHITE ,
," INCLUDE" ' >WHITE ,
," [DEFINED]" ' >WHITE ,
," [UNDEFINED]" ' >WHITE ,
," CASE" ' >CASE ,
," OF" ' >OF ,
," ENDOF" ' >ENDOF ,
," ENDCASE" ' >ENDCASE ,
NULL ,
:this keyword does> \ standard behavior of keyword
2 string-key row if cell+ @c execute else drop type then ;
\ prerequisites of CONVERT.4TH
: Usage abort" Usage: case24th Forth-file 4tH-file" ;
: Read-file refill ;
: PreProcess case-stack stack ;
: PostProcess case-stack adepth abort" Unmatched CASE" ;
: Process begin bl parse keyword eol? until ;
include lib/convert.4th
|