summaryrefslogtreecommitdiff
path: root/json.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'json.lisp')
-rw-r--r--json.lisp21
1 files changed, 21 insertions, 0 deletions
diff --git a/json.lisp b/json.lisp
index b9ea796..2bc94db 100644
--- a/json.lisp
+++ b/json.lisp
@@ -1 +1,22 @@
(in-package #:json)
+
+(defparameter number-parser
+ (let ((signed-digits
+ (comp ((sign (zero-or-one (unit (lambda (x) (or (char= x #\-)
+ (char= x #\+))))))
+ (natural (one-or-more (unit #'digit-char-p))))
+ (cons sign natural))))
+ (comp ((base (any signed-digits
+ (fail "Malformed number.")))
+ (dot (zero-or-one (unit (lambda (x) (char= x #\.)))))
+ (fraction (if dot
+ (any (one-or-more (unit #'digit-char-p))
+ (fail "Malformed fractional part."))
+ (new nil)))
+ (e (zero-or-one (unit (lambda (x) (or (char= x #\e)
+ (char= x #\E))))))
+ (exponent (if e
+ (any signed-digits
+ (fail "Malformed exponent part."))
+ (new nil))))
+ (list 'number base fraction exponent))))