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 [ 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 [ 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
58 : (parse) ( str -- ) line-text set 0 column set parse-loop ;
61 : bad-escape ( -- * ) <bad-escape> throw ;
63 ! Parsing word utilities
64 : escape ( escape -- ch )
75 } hash [ bad-escape ] unless* ;
77 : next-escape ( n str -- n ch )
79 [ >r 1+ dup 4 + tuck r> subseq hex> ]
80 [ over 1+ -rot nth escape ] if ;
82 : next-char ( n str -- n ch )
84 [ >r 1+ r> next-escape ] [ over 1+ -rot nth ] if ;
86 : (parse-string) ( n str -- n )
88 [ drop 1+ ] [ [ next-char , ] keep (parse-string) ] if ;
90 : parse-string ( -- str )
92 [ [ line-text get (parse-string) ] "" make swap ] change ;
94 : (parse-effect) ( -- )
96 dup ")" = [ drop ] [ , (parse-effect) ] if
98 "Unexpected EOL" throw
101 : parse-effect ( -- effect )
102 [ (parse-effect) column get ] { } make swap column set
103 { "--" } split1 <effect> ;
105 : parse-base ( parsed base -- parsed ) scan swap base> parsed ;
109 "scratchpad" "syntax" "arrays" "compiler" "definitions"
110 "errors" "generic" "hashtables" "inference"
111 "io" "kernel" "listener" "math"
112 "memory" "modules" "namespaces" "parser" "prettyprint"
113 "sequences" "shells" "strings" "styles" "test"
114 "threads" "tools" "vectors" "words"