Began working on json library (fresh start after thinking about instantiation in terms of search strategies)
This commit is contained in:
133
src/lib/json.pl
Normal file
133
src/lib/json.pl
Normal file
@@ -0,0 +1,133 @@
|
||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Written Apr 2021 by Aram Panasenco (panasenco@ucla.edu)
|
||||
Part of Scryer Prolog.
|
||||
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2021, Aram Panasenco
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||
|
||||
:- module(json, [
|
||||
json_whitespace//0,
|
||||
json_string//1
|
||||
]).
|
||||
|
||||
:- use_module(library(charsio)).
|
||||
:- use_module(library(clpz)).
|
||||
:- use_module(library(dcgs)).
|
||||
:- use_module(library(dif)).
|
||||
:- use_module(library(error)).
|
||||
:- use_module(library(lists)).
|
||||
|
||||
char_uniontypes(Char, Types) :-
|
||||
must_be(list, Types),
|
||||
bagof(Type, (char_type(Char, Type), member(Type, Types)), [_|_]).
|
||||
|
||||
json_whitespace --> "".
|
||||
json_whitespace --> " ", json_whitespace.
|
||||
json_whitespace --> "\n", json_whitespace.
|
||||
json_whitespace --> "\r", json_whitespace.
|
||||
json_whitespace --> "\t", json_whitespace.
|
||||
|
||||
escape_map([
|
||||
'"' - '"',
|
||||
('\\') - ('\\'),
|
||||
('/') - ('/'),
|
||||
'\b' - 'b',
|
||||
'\f' - 'f',
|
||||
'\n' - 'n',
|
||||
'\r' - 'r',
|
||||
'\t' - 't'
|
||||
]).
|
||||
|
||||
hex(0) --> "0".
|
||||
hex(1) --> "1".
|
||||
hex(2) --> "2".
|
||||
hex(3) --> "3".
|
||||
hex(4) --> "4".
|
||||
hex(5) --> "5".
|
||||
hex(6) --> "6".
|
||||
hex(7) --> "7".
|
||||
hex(8) --> "8".
|
||||
hex(9) --> "9".
|
||||
hex(10) --> "a".
|
||||
hex(11) --> "b".
|
||||
hex(12) --> "c".
|
||||
hex(13) --> "d".
|
||||
hex(14) --> "e".
|
||||
hex(15) --> "f".
|
||||
|
||||
inner_string("") --> "".
|
||||
inner_string([PrintChar | Tail]) -->
|
||||
[PrintChar],
|
||||
{
|
||||
escape_map(EscapeMap),
|
||||
\+ member(PrintChar-_, EscapeMap),
|
||||
(
|
||||
PrintChar = ' '
|
||||
; char_uniontypes(PrintChar, [alphanumeric, ascii_graphic])
|
||||
)
|
||||
},
|
||||
inner_string(Tail).
|
||||
inner_string([EscapeChar | Tail]) -->
|
||||
"\\",
|
||||
[PrintChar],
|
||||
{
|
||||
escape_map(EscapeMap),
|
||||
member(EscapeChar-PrintChar, EscapeMap)
|
||||
},
|
||||
inner_string(Tail).
|
||||
inner_string([NonPrintChar | Tail]) -->
|
||||
"\\u",
|
||||
{
|
||||
[H1, H2, H3, H4] ins 0..15,
|
||||
NonPrintCharCode in 0..65535,
|
||||
NonPrintCharCode #= H1 * 16^3 + H2 * 16^2 + H3 * 16 + H4,
|
||||
(
|
||||
ground(NonPrintChar) ->
|
||||
escape_map(EscapeMap),
|
||||
\+ member(NonPrintChar-_, EscapeMap),
|
||||
dif(NonPrintChar, ' '),
|
||||
\+ char_uniontypes(NonPrintChar, [alphanumeric, ascii_graphic]),
|
||||
char_code(NonPrintChar, NonPrintCharCode)
|
||||
; true
|
||||
)
|
||||
},
|
||||
hex(H1),
|
||||
hex(H2),
|
||||
hex(H3),
|
||||
hex(H4),
|
||||
{
|
||||
\+ ground(NonPrintChar) ->
|
||||
char_code(NonPrintChar, NonPrintCharCode)
|
||||
; true
|
||||
},
|
||||
inner_string(Tail).
|
||||
|
||||
json_string(Inner) --> "\"", inner_string(Inner), "\"".
|
||||
Reference in New Issue
Block a user