summaryrefslogtreecommitdiff
path: root/json.lisp
diff options
context:
space:
mode:
authorJuan Manuel Tomás <jtomas1815@gmail.com>2022-10-30 17:56:01 -0300
committerJuan Manuel Tomás <jtomas1815@gmail.com>2022-10-30 17:56:01 -0300
commitea1ef4c6ad6788bafe232f91d9a1bf03d48e4ff3 (patch)
treeb9601f4983e1de06fd9848672ee4cbe1e0d67dac /json.lisp
parent2afa93a7a96df494267a0846ae4bc13d0dd538ea (diff)
downloadjson-ea1ef4c6ad6788bafe232f91d9a1bf03d48e4ff3.tar.gz
json-ea1ef4c6ad6788bafe232f91d9a1bf03d48e4ff3.zip
Add a number parser
Most of the spec regarding numbers is covered but currently numbers can have leading 0's and + sign.
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))))