|
|
1.1 root 1: \ tag: Forth preprocessor
2: \
3: \ Forth preprocessor
4: \
5: \ Copyright (C) 2003, 2004 Samuel Rydh
6: \
7: \ See the file "COPYING" for further information about
8: \ the copyright and warranty status of this work.
9: \
10:
11: 0 value prep-wid
12: 0 value prep-dict
13: 0 value prep-here
14:
15: : ([IF])
16: begin
17: begin parse-word dup 0= while
18: 2drop refill
19: repeat
20:
21: 2dup " [IF]" strcmp 0= if 1 throw then
22: 2dup " [IFDEF]" strcmp 0= if 1 throw then
23: 2dup " [ELSE]" strcmp 0= if 2 throw then
24: 2dup " [THEN]" strcmp 0= if 3 throw then
25: " \\" strcmp 0= if linefeed parse 2drop then
26: again
27: ;
28:
29: : [IF] ( flag -- )
30: if exit then
31: 1 begin
32: ['] ([IF]) catch case
33: \ EOF (FIXME: this does not work)
34: \ -1 of ." Missing [THEN]" abort exit endof
35: \ [IF]
36: 1 of 1+ endof
37: \ [ELSE]
38: 2 of dup 1 = if 1- then endof
39: \ [THEN]
40: 3 of 1- endof
41: endcase
42: dup 0 <=
43: until drop
44: ; immediate
45:
46: : [ELSE] 0 [ ['] [IF] , ] ; immediate
47: : [THEN] ; immediate
48:
49: :noname
50: 0 to prep-wid
51: 0 to prep-dict
52: ; initializer
53:
54: : [IFDEF] ( <word> -- )
55: prep-wid if
56: parse-word prep-wid search-wordlist dup if nip then
57: else 0 then
58: [ ['] [IF] , ]
59: ; immediate
60:
61: : [DEFINE] ( <word> -- )
62: parse-word here get-current >r >r
63: prep-dict 0= if
64: 2000 alloc-mem here!
65: here to prep-dict
66: wordlist to prep-wid
67: here to prep-here
68: then
69: prep-wid set-current prep-here here!
70: $create
71: here to prep-here
72: r> r> set-current here!
73: ; immediate
74:
75: : [0] 0 ; immediate
76: : [1] 1 ; immediate
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.