;; very slow json parser (use prcc) (define true ( "true")) (define false ( "false")) (define null ( "null")) (define e ( ( "e+") ( "e-") ( "E+") ( "E-") ( #\e) ( #\E))) (define digits ( "\\d+")) (define expp ( e digits)) (define frac ( ( #\.) digits)) (define int ( ( ( #\-) digits) digits)) (define number ( ( int frac expp) ( int frac) ( int expp) ( int))) (define ch ( ( "\\\\u[0-9a-f]{4}") ( "\\\"") ( "\\\\") ( "\\b") ( "\\f") ( "\\n") ( "\\r") ( "\\t") ( "[^\"]"))) (define chars (<+> ch)) (define str ( ( ( #\") ( #\")) ( ( #\") chars ( #\")))) (define value ( (lazy array) (lazy object) str number true false null)) (define pair ( str ( #\:) value)) (define members (join+ pair ( () (char #\,) ()))) (define object ( ( ( #\{) ( #\})) ( ( #\{) members ( #\})))) (define elements (join+ value ( () ( #\,) ()))) (define array ( ( ( #\[) ( #\])) ( ( #\[) elements ( #\])))) (define parser ( value (eof))) (use test) (test-group "json" (test-begin "json") (define result #f) (for-each (lambda (f) (set! result (parse-file f parser)) (test-assert result) (display result) (newline)) (cdr (argv))) (test-end "json"))