% ------------ % JSON support % ------------ object([])--> wsp, "{", wsp, "}", wsp. object(X)--> wsp, "{", wsp, members(X), wsp, "}", wsp. members([X|Y])--> pair(X), wsp, ",", wsp, !, members(Y). members([X])--> pair(X), !. pair(pair(X,Y))--> string(X), wsp, ":", wsp, value(Y). array([])--> "[", wsp, "]". array(X)--> "[", wsp, elements(X), wsp, "]". elements([X|Y])--> value(X), wsp, ",", wsp, elements(Y). elements([X])--> value(X). value(X)--> string(X), !. value(X)--> number(X), !. value(X)--> object(X), !. value(X)--> array(X), !. value(true)--> "true", !. value(false)--> "false", !. value(null)--> "null". string(X)--> "\"", chars(Y), "\"", {atom_codes(X,Y)}. chars([X|Y])--> char(X), !, chars(Y). chars([])--> []. char(0'")--> "\\\"". char(0'\\)--> "\\\\". char(0'/)--> "\\/". char(0'\b)--> "\\b". char(0'\f)--> "\\f". char(0'\n)--> "\\n". char(0'\r)--> "\\r". char(0'\t)--> "\\t". char(X)--> [X], {X >= 32, X \== 0'"}. number(X)--> int(A), frac(B), exp(C), !, {lists:append(A,B,D), lists:append(D,C,E), number_codes(X,E)}. number(X)--> int(A), frac(B), !, {lists:append(A,B,C), number_codes(X,C)}. number(X)--> int(A), exp(B), !, {lists:append(A,B,C), number_codes(X,C)}. number(X)--> int(A), {number_codes(X,A)}. int([0'-,X|Y])--> "-", digit(X), digits(Y). int([0'-,X])--> "-", digit(X), !. int([X|Y])--> digit(X), digits(Y), !. int([X])--> digit(X), !. frac([0'.|X])--> ".", digits(X). exp(X) --> e(A), digits(B), {lists:append(A,B,X)}. digits([X|Y])--> digit(X), !, digits(Y). digits([])--> []. e("e+")--> "e+". e("e+")--> "E+". e("e-")--> "e-". e("e-")--> "E-". e("e+")--> "e". e("e+")--> "E". digit(X)--> [X], {0'0 =< X, X =< 0'9}. wsp--> wschar, !, wsp. wsp--> "//", !, comment, wsp. wsp--> []. wschar--> " ". wschar--> "\t". wschar--> "\n". wschar--> "\r". comment--> "\n", !. comment--> "\r", !. comment--> [_], !, comment. % This is tested in the proof engine % http://eulersharp.sourceforge.net/2006/02swap/euler.yap % and the result is at % http://lists.w3.org/Archives/Public/www-archive/2007Jan/0000.html