--- json-abnf.orig/json-abnf.scm 2011-11-27 21:14:06.000000000 +0100 +++ json-abnf/json-abnf.scm 2011-11-27 22:25:51.000000000 +0100 @@ -26,7 +26,7 @@ (module json-abnf - (parser) + (parse-json) (import scheme chicken data-structures srfi-1 srfi-14) @@ -35,7 +35,6 @@ (prefix abnf-consumers abnf:) ) - ;; helper macro for mutually-recursive parser definitions (define-syntax vac @@ -53,7 +52,6 @@ ((_ p) (abnf:bind consumed-chars->number p)) )) - (define escaped-char->control-char (abnf:consumed-chars->list (lambda (x) @@ -64,27 +62,24 @@ ((#\r) #\return ) ((#\t) #\tab ) (else (car x)))))) - (define-syntax bind-consumed->control-char (syntax-rules () ((_ p) (abnf:bind escaped-char->control-char p)) )) - (define consumed-chars->char-code (abnf:consumed-chars->list (compose (lambda (x) (integer->char (string->number x 16))) list->string))) - (define-syntax bind-consumed->char-code (syntax-rules () ((_ p) (abnf:bind consumed-chars->char-code p)) )) (define (value? x) (or (string? x) (number? x) (boolean? x) - (vector? x) (list? x))) + (vector? x) (pair? x) (symbol? x))) (define consumed-values (abnf:consumed-objects value?)) (define consumed-values->list @@ -97,6 +92,16 @@ ((_ p) (abnf:bind (consumed-values->list) p)) )) +(define consumed-values->pair + ((abnf:consumed-objects-lift consumed-values) + (lambda (l) + (cons (car l) (cadr l))))) + +(define-syntax bind-consumed-values->pair + (syntax-rules () + ((_ p) (abnf:bind consumed-values->pair p)) + )) + ;; construct vectors from consumed values (define consumed-values->vector ((abnf:consumed-objects-lift consumed-values) @@ -125,21 +130,21 @@ (abnf:alternatives false null true number p-string object array))) +(define true + (abnf:bind + (lambda x (list #t)) + (abnf:lit "true"))) + (define false (abnf:bind - (abnf:consumed-chars->list (lambda x #f)) + (lambda x (list #f)) (abnf:lit "false"))) (define null (abnf:bind - (abnf:consumed-chars->list (lambda x '())) + (lambda x (list 'null)) (abnf:lit "null"))) -(define true - (abnf:bind - (abnf:consumed-chars->list (lambda x (list #t))) - (abnf:lit "true"))) - (define escaped (abnf:concatenation (abnf:drop-consumed (abnf:char #\\)) @@ -151,7 +156,6 @@ (bind-consumed->char-code (abnf:repetition-n 4 abnf:hexadecimal))) ))) - (define char (abnf:alternatives @@ -162,8 +166,6 @@ (ucs-range->char-set #x5D #x10FFFF))) escaped)) - - (define p-string (abnf:alternatives (abnf:bind-consumed->string @@ -173,8 +175,6 @@ (abnf:drop-consumed (abnf:char #\")))) (abnf:bind (lambda (x) (list "")) (abnf:concatenation (abnf:char #\") (abnf:char #\"))) )) - - (define number (let* ((digit (abnf:range #\0 #\9)) @@ -201,18 +201,16 @@ significand (abnf:optional-sequence exp)))))) - (define p-member - (bind-consumed-values->list + (bind-consumed-values->pair (abnf:concatenation p-string name-separator value ))) - (define object - (bind-consumed-values->list 'object + (bind-consumed-values->list (abnf:concatenation (abnf:drop-consumed begin-object) (abnf:optional-sequence @@ -224,7 +222,6 @@ p-member)))) (abnf:drop-consumed end-object)))) - (define array (bind-consumed-values->vector (abnf:concatenation @@ -238,23 +235,18 @@ value ) ))) (abnf:drop-consumed end-array)))) - - (define JSON-text (abnf:alternatives object array)) - (define (->char-list s) (if (string? s) (string->list s) s)) - (define (err s) (print "JSON parser error on stream: " s) `(error)) - -(define parser +(define parse-json (lambda (s) (JSON-text caar err `(() ,(->char-list s))))) -) \ Kein Zeilenumbruch am Dateiende. +)