From: panasenco Date: Sun, 18 Apr 2021 04:44:57 +0000 (-0700) Subject: Parsing and generating JSON numbers works perfectly now as far as I can tell X-Git-Tag: v0.9.0~99^2~9 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=216d4da85af4c4181c7a1a2e4611eba3785a5762;p=scryer-prolog.git Parsing and generating JSON numbers works perfectly now as far as I can tell --- diff --git a/src/lib/json.pl b/src/lib/json.pl index c83cd6fd..26814df6 100644 --- a/src/lib/json.pl +++ b/src/lib/json.pl @@ -35,7 +35,10 @@ :- module(json, [ json_whitespace//0, - json_string//1 + json_string//1, + json_number//1, + json_value//1, + json_array//1 ]). :- use_module(library(charsio)). @@ -44,6 +47,7 @@ :- use_module(library(dif)). :- use_module(library(error)). :- use_module(library(lists)). +:- use_module(library(reif)). char_uniontypes(Char, Types) :- must_be(list, Types), @@ -130,4 +134,63 @@ inner_string([NonPrintChar | Tail]) --> }, inner_string(Tail). -json_string(Inner) --> "\"", inner_string(Inner), "\"". +json_string(Inner) --> + "\"", + inner_string(Inner), + "\"". + +posdigit(Digit) --> [Digit], {member(Digit, "123456789")}. +digit('0') --> "0". +digit(Digit) --> posdigit(Digit). +number_str(['-'|Rest], sign) --> "-", number_str(Rest, wholestart). +number_str(Rest, sign) --> number_str(Rest, wholestart). +number_str([PosDigit|Rest], wholestart) --> posdigit(PosDigit), number_str(Rest, wholerest). +number_str(['0'|Rest], wholestart) --> "0", number_str(Rest, fractionstart). +number_str([Digit|Rest], wholerest) --> digit(Digit), number_str(Rest, wholerest). +number_str(Rest, wholerest) --> number_str(Rest, fractionstart). +number_str(Rest, wholerest) --> number_str(Rest, exponentstart). +number_str(['.'|Rest], fractionstart) --> ".", number_str(Rest, fraction). +number_str([Digit|Rest], fraction) --> digit(Digit), number_str(Rest, fraction). +number_str([Digit|Rest], fraction) --> digit(Digit), number_str(Rest, exponentstart). +number_str(['e'|Rest], exponentstart) --> "e", number_str(Rest, exponentsign). +number_str(['e'|Rest], exponentstart) --> "E", number_str(Rest, exponentsign). +number_str("", exponentstart) --> "". +number_str(['-'|Rest], exponentsign) --> "-", number_str(Rest, exponent). +number_str(Rest, exponentsign) --> "+", number_str(Rest, exponent). +number_str(Rest, exponentsign) --> number_str(Rest, exponent). +number_str([Digit|Rest], exponent) --> digit(Digit), number_str(Rest, exponent). +number_str([Digit], exponent) --> digit(Digit). + +json_number(Number) --> + { + ground(Number) -> + ( + number(Number) -> + number_chars(Number, NumberChars) + ; false + ) + ; true + }, + number_str(NumberChars, sign), + { + ground(Number) -> + true + ; number_chars(Number, NumberChars) + }. + +inner_value(String) --> json_string(String). +inner_value(Number) --> json_number(Number). +%inner_value(Object) --> json_object(Object). +inner_value(Array) --> json_array(Array). +inner_value(true) --> "true". +inner_value(false) --> "false". +inner_value(null) --> "null". +json_value(Value) --> json_whitespace, inner_value(Value), json_whitespace. + +inner_array([]) --> "". +inner_array([Value]) --> json_value(Value). +inner_array([Value1, Value2 | Tail]) --> + json_value(Value1), + ",", + inner_array([Value2 | Tail]). +json_array(List) --> "[", inner_array(List), "]".