
vypis(X) :-
    string_chars(X,Y),
    vypischars(Y).

vypischars([]).
vypischars([H|T]) :-
    writeln(H),
    vypischars(T).

%simple spravne uzavorkovany vyraz
ssuv --> ['(',')'].
ssuv --> ['{','}'].
ssuv --> ['[',']'].

ssuv --> ['('],suv,[')'].
ssuv --> ['{'],suv,['}'].
ssuv --> ['['],suv,[']'].

suv --> ssuv;
        ssuv,suv.

verify_suv(S):-
    string_chars(S,V1),
    suv(V1,[]).

parse_int(String, X, Zb):-
    string_chars(String,V1),
    int_val(X,0, V1, Zb).

digit(0,'0').
digit(1,'1').
digit(2,'2').
digit(3,'3').
digit(4,'4').
digit(5,'5').
digit(6,'6').
digit(7,'7').
digit(8,'8').
digit(9,'9').

int_val(V, V) --> [].
%int_val(V, V, [H|T], [H|T]) :- \+ digit(_,H).
int_val(V,A) -->
    [H],
    {digit(V1,H),
    A1 is A*10 + V1},
    int_val(V,A1).

parse_json(String, X):-
    string_chars(String,V1),
    json(X,V1,[]).

json(X) -->
    json_int(X);
    json_list(X);
    json_object(X);
    json_string(X).

json_int(V) -->
    int_val(V,0).

json_string(str(S))-->
    ['"'],in_string(S),['"'].
in_string([]) --> {true}.
in_string([C|S]) --> [C],{\+ C = '"'},in_string(S).

json_list(X) --> ['['],in_list(X),[']'].
in_list([]) --> {true}.
in_list([X]) --> json(X).
in_list([X|Y]) --> json(X), [','], in_list(Y).

json_object(obj(X)) --> ['{'], in_object(X),['}'].

in_object([]) --> {true}.
in_object([X]) --> keyval(X).
in_object([X|Y]) --> keyval(X), [','], in_object(Y).
keyval(kv(K, V)) --> json_string(K), [':'], json(V).
