| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | ! Copyright (C) 2008 Peter Burns, 2009 Philipp Winkler | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | USING: arrays assocs combinators io io.streams.string json | 
					
						
							| 
									
										
										
										
											2009-06-06 23:49:44 -04:00
										 |  |  | kernel math math.parser math.parser.private prettyprint | 
					
						
							|  |  |  | sequences strings vectors ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: json.reader | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-15 04:07:55 -05:00
										 |  |  | <PRIVATE
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | : value ( char -- num char )
 | 
					
						
							|  |  |  |     1string " \t\r\n,:}]" read-until
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         append
 | 
					
						
							|  |  |  |         [ string>float ] | 
					
						
							|  |  |  |         [ [ "eE." index ] any? [ >integer ] unless ] bi
 | 
					
						
							|  |  |  |     ] dip ;
 | 
					
						
							| 
									
										
										
										
											2008-11-08 15:08:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | DEFER: j-string | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | : convert-string ( str -- str )
 | 
					
						
							|  |  |  |     read1
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         { CHAR: b [ 8 ] } | 
					
						
							|  |  |  |         { CHAR: f [ 12 ] } | 
					
						
							|  |  |  |         { CHAR: n [ CHAR: \n ] } | 
					
						
							|  |  |  |         { CHAR: r [ CHAR: \r ] } | 
					
						
							|  |  |  |         { CHAR: t [ CHAR: \t ] } | 
					
						
							|  |  |  |         { CHAR: u [ 4 read hex> ] } | 
					
						
							|  |  |  |         [ ] | 
					
						
							|  |  |  |     } case
 | 
					
						
							|  |  |  |     dup
 | 
					
						
							|  |  |  |     [ 1string append j-string append ] | 
					
						
							|  |  |  |     [ drop ] if ;
 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | : j-string ( -- str )
 | 
					
						
							|  |  |  |     "\\\"" read-until CHAR: \" =
 | 
					
						
							|  |  |  |     [ convert-string ] unless ;
 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | : second-last ( seq -- second-last )
 | 
					
						
							|  |  |  |     [ length 2 - ] keep nth ; inline
 | 
					
						
							| 
									
										
										
										
											2008-11-08 15:08:58 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | : third-last ( seq -- third-last )
 | 
					
						
							|  |  |  |     [ length 3 - ] keep nth ; inline
 | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  | : last2 ( seq -- second-last last )
 | 
					
						
							|  |  |  |     [ second-last ] [ last ] bi ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | : last3 ( seq -- third-last second-last last )
 | 
					
						
							|  |  |  |     [ third-last ] [ last2 ] bi ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | : v-over-push ( vec -- vec' )
 | 
					
						
							|  |  |  |     dup length 2 >=
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         dup
 | 
					
						
							|  |  |  |         [ pop ] | 
					
						
							|  |  |  |         [ last ] bi push
 | 
					
						
							|  |  |  |     ] when ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | : v-pick-push ( vec -- vec' )
 | 
					
						
							|  |  |  |     dup length 3 >=
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         dup
 | 
					
						
							|  |  |  |         [ pop ] | 
					
						
							|  |  |  |         [ second-last ] bi push
 | 
					
						
							|  |  |  |     ] when ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-06 23:49:44 -04:00
										 |  |  | : (close-array) ( accum -- accum' )
 | 
					
						
							|  |  |  |     dup last vector? [ v-over-push ] unless
 | 
					
						
							|  |  |  |     dup pop >array over push ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | : (close-hash) ( accum -- accum' )
 | 
					
						
							|  |  |  |     dup length 3 >= [ v-over-push ] when
 | 
					
						
							|  |  |  |     dup dup [ pop ] dip pop swap
 | 
					
						
							|  |  |  |     zip H{ } assoc-clone-like over push ;
 | 
					
						
							|  |  |  |                                                   | 
					
						
							|  |  |  | : scan ( accum char -- accum )
 | 
					
						
							| 
									
										
										
										
											2009-06-06 23:49:44 -04:00
										 |  |  |     ! 2dup . . ! Great for debug... | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             { CHAR: \" [ j-string over push ] } | 
					
						
							|  |  |  |             { CHAR: [  [ V{ } clone over push ] } | 
					
						
							|  |  |  |             { CHAR: ,  [ v-over-push ] } | 
					
						
							| 
									
										
										
										
											2009-06-06 23:49:44 -04:00
										 |  |  |             { CHAR: ]  [ (close-array) ] } | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  |             { CHAR: {  [ 2 [ V{ } clone over push ] times ] } | 
					
						
							|  |  |  |             { CHAR: :  [ v-pick-push ] } | 
					
						
							|  |  |  |             { CHAR: }  [ (close-hash) ] } | 
					
						
							|  |  |  |             { CHAR: \u000020 [ ] } | 
					
						
							|  |  |  |             { CHAR: \t [ ] } | 
					
						
							|  |  |  |             { CHAR: \r [ ] } | 
					
						
							|  |  |  |             { CHAR: \n [ ] } | 
					
						
							|  |  |  |             { CHAR: t  [ 3 read drop t over push ] } | 
					
						
							|  |  |  |             { CHAR: f  [ 4 read drop f over push ] } | 
					
						
							|  |  |  |             { CHAR: n  [ 3 read drop json-null over push ] } | 
					
						
							|  |  |  |             [ value [ over push ] dip [ scan ] when*  ] | 
					
						
							|  |  |  |         } case  | 
					
						
							|  |  |  |     ] when* ;
 | 
					
						
							| 
									
										
										
										
											2008-11-15 04:09:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  | : (json-parser>) ( string -- object )
 | 
					
						
							|  |  |  |     [ V{ } clone [ read1 dup ] [ scan ] while drop first ] with-string-reader ;
 | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2008-11-15 04:09:57 -05:00
										 |  |  | PRIVATE>
 | 
					
						
							| 
									
										
										
										
											2009-05-29 17:41:24 -04:00
										 |  |  |      | 
					
						
							|  |  |  | : json> ( string -- object )
 | 
					
						
							|  |  |  |     (json-parser>) ;
 |