%  http://www.w3.org/DesignIssues/Notation3.html
%  http://www.w3.org/2001/03/flaten3/lexer.l
%  http://www.w3.org/2001/03/flaten3/parser.y

:- auto_table. 
:- import append/3 from basics.
:- import member/2 from basics.

symbol(Text, Table) 
--> "<", uri_reference(Text), ">";
    qname(Text, Table);
    string1(Text);
    string2(Text).

% XXX dont handle escapes right
string1(Text, Li, Lo) :- string1(Li, Lo), append(Text, Lo, Li).
string2(Text, Li, Lo) :- string2(Li, Lo), append(Text, Lo, Li).

qname  --> ([]; ncname), ":", ncname.

qname(Name, Table, Li, Lo) :-
  (ncname(Name1, Li, L1) ; li=L1, Name1=""),
  append(":", L2, L1),
  ncname(Name2, L2, Lo),
  member([prefix, Name1, Expansion], Table),
  append(Expansion, Name2, Name).

ncname(Name, Li, Lo) :-
  ncname(Li, Lo),
  append(Name, Lo, Li).

% http://www.w3.org/TR/REC-xml-names/#NT-NCName


ncname --> (letter; "_"), ncname_tail.
ncname_tail --> [] ; ncname_char, ncname_tail.
ncname_char --> letter; digit; "."; "-"; "_"; combiningchar; extender.
letter --> "a"; "b"; "c".   % ...
digit --> "0"; "1"; "2".   % ...
combiningchar --> "".
extender --> "".

string1 --> [34], string1_contents, [34].
string1_contents --> []; string1_char.
string1_char --> ordinary_char; [92, 92]; [92, 34].   % \" and \\

string2 --> [34, 34, 34], string2_contents, [34, 34, 34].
string2_contents --> []; string2_char.
string2_char --> ordinary_char; 
	         [34], ordinary_char;
		 [34, 34], ordinary_char.

ordinary_char --> "a"; "b"; "c".

statement --> symbol, w1, symbol, w1, symbol.
terminated_statement --> statement , w0, ".".

w1 --> " ", w0.
w0 --> []; w1.

message --> w0 ; w0, statement ; w0, terminated_statement, message.

