1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: arrays definitions errors generic hashtables kernel math
5 namespaces prettyprint sequences strings vectors words ;
7 : skip ( i seq quot -- n )
8 over >r find* drop dup -1 =
9 [ drop r> length ] [ r> drop ] if ; inline
12 column-number [ line-text get [ blank? not ] skip ] change ;
14 : skip-word ( m line -- n )
15 2dup nth CHAR: " = [ drop 1+ ] [ [ blank? ] skip ] if ;
17 : (scan) ( n line -- start end )
18 dupd 2dup length < [ skip-word ] [ drop ] if ;
22 column-number [ line-text get (scan) dup ] change
23 2dup = [ 2drop f ] [ line-text get subseq ] if ;
25 : CREATE ( -- word ) scan create-in ;
29 : do-what-i-mean ( string -- restarts )
30 words-named natural-sort [
31 [ "Use the word " swap summary append ] keep 2array
36 : no-word ( name -- word )
37 dup <no-word> swap do-what-i-mean condition ;
39 : search ( str -- word )
40 dup use get hash-stack [ ] [
41 no-word dup word-vocabulary use+
44 : scan-word ( -- obj )
46 dup ";" = not string-mode get and [
47 dup string>number [ ] [ search ] ?if
51 : parsed ( parse-tree obj -- parse-tree ) swap ?push ;
55 dup parsing? [ execute ] [ parsed ] if parse-loop
65 : bad-escape ( -- * ) <bad-escape> throw ;
67 ! Parsing word utilities
68 : escape ( escape -- ch )
79 } hash [ bad-escape ] unless* ;
81 : next-escape ( n str -- n ch )
83 [ >r 1+ dup 4 + tuck r> subseq hex> ]
84 [ over 1+ -rot nth escape ] if ;
86 : next-char ( n str -- n ch )
88 [ >r 1+ r> next-escape ] [ over 1+ -rot nth ] if ;
90 : (parse-string) ( n str -- n )
92 [ drop 1+ ] [ [ next-char , ] keep (parse-string) ] if ;
94 : parse-string ( -- str )
96 [ [ line-text get (parse-string) ] "" make swap ] change ;
98 : (parse-effect) ( -- )
100 dup ")" = [ drop ] [ , (parse-effect) ] if
102 "Unexpected EOL" throw
105 : string>effect ( seq -- effect )
106 { "--" } split1 dup [
109 "Stack effect declaration must contain --" throw
112 : parse-effect ( -- effect )
113 [ (parse-effect) column-number get ] { } make
114 swap column-number set
117 : parse-base ( parsed base -- parsed ) scan swap base> parsed ;
121 "scratchpad" "syntax" "arrays" "definitions"
122 "errors" "generic" "hashtables" "help" "inference"
123 "io" "kernel" "listener" "math" "memory" "modules"
124 "namespaces" "parser" "prettyprint" "sequences" "shells"
125 "strings" "styles" "tools" "vectors" "words"