79 lines
1.7 KiB
Plaintext
79 lines
1.7 KiB
Plaintext
|
|
||
|
:- object(xml).
|
||
|
|
||
|
|
||
|
:- info([
|
||
|
version is 1.0,
|
||
|
date is 2003/7/7,
|
||
|
author is 'Paulo Moura',
|
||
|
comment is 'Conversion between compound terms and XML.']).
|
||
|
|
||
|
|
||
|
:- public(convert/3).
|
||
|
|
||
|
:- mode(convert(@compound, @compound, -atom), zero_or_one).
|
||
|
:- mode(convert(-compound, -compound, +atom), zero_or_one).
|
||
|
|
||
|
:- info(convert/3, [
|
||
|
comment is 'Converts between a compound term and an interpretation and XML.',
|
||
|
argnames is ['Term', 'Interpretation', 'XML']]).
|
||
|
|
||
|
|
||
|
convert(Term, Interpretation, XML) :-
|
||
|
var(XML) ->
|
||
|
phrase(term(Term, Interpretation), List),
|
||
|
atom_codes(XML, List)
|
||
|
;
|
||
|
atom_codes(XML, List),
|
||
|
phrase(term(Term, Interpretation), List).
|
||
|
|
||
|
|
||
|
term(Term, Interpretation) -->
|
||
|
{nonvar(Term), nonvar(Interpretation),
|
||
|
Interpretation =.. [Functor| Tags], Term =.. [Functor| Args]},
|
||
|
open_tag(Functor),
|
||
|
arguments(Tags, Args),
|
||
|
close_tag(Functor).
|
||
|
|
||
|
term(Term, Interpretation) -->
|
||
|
{var(Term), var(Interpretation)},
|
||
|
open_tag(Functor),
|
||
|
arguments(Tags, Args),
|
||
|
close_tag(Functor),
|
||
|
{Interpretation =.. [Functor| Tags], Term =.. [Functor| Args]}.
|
||
|
|
||
|
|
||
|
arguments([], []) -->
|
||
|
[].
|
||
|
|
||
|
arguments([Tag| Tags], [Arg| Args]) -->
|
||
|
open_tag(Tag),
|
||
|
value(Arg),
|
||
|
close_tag(Tag),
|
||
|
arguments(Tags, Args).
|
||
|
|
||
|
|
||
|
open_tag(Tag) -->
|
||
|
"<", value(Tag), ">".
|
||
|
|
||
|
close_tag(Tag) -->
|
||
|
"</", value(Tag), ">".
|
||
|
|
||
|
|
||
|
value(Value) -->
|
||
|
{nonvar(Value), atom_codes(Value, Codes)}, characters(Codes).
|
||
|
|
||
|
value(Value) -->
|
||
|
{var(Value)}, characters(Codes), {atom_codes(Value, Codes)}.
|
||
|
|
||
|
|
||
|
characters([]) --> [].
|
||
|
characters([Code| Codes]) --> [Code], {character(Code)}, characters(Codes).
|
||
|
|
||
|
|
||
|
character(Code) :- Code @>= 0'a, Code @=< 0'z, !.
|
||
|
character(Code) :- Code @>= 0'A, Code @=< 0'Z.
|
||
|
|
||
|
|
||
|
:- end_object.
|