


unparse def list (>sep,>i, >LIST * unparse def*unparse def els , show def+show def els>):
        unparse def(>i,>unparse def,show def>),
        unparse def els (>sep,>i,>unparse def els ,show def els >), ->;
unparse def list (>sep,>i,>LIST*empty,empty>):.

unparse def els (>sep,>i,>unparse def * unparse def els ,sep+show def+show def els >):
        unparse def(>i,>unparse def,show def>),
        unparse def els (>sep,>i,>unparse def els ,show def els >), ->;
unparse def els (>sep,>i,>empty,empty>):.

unparse partyp list (>i, >LIST * unparse partyp*unparse partyp els , show partyp+show partyp els >):
        unparse partyp(>i,>unparse partyp,show partyp>),
        unparse partyp els (>i,>unparse partyp els ,show partyp els >), ->;
unparse partyp list (>i,>LIST*empty,empty>):.

unparse partyp els (>i,>unparse partyp * unparse partyp els ,show partyp+show partyp els >):
        unparse partyp(>i,>unparse partyp,show partyp>),
        unparse partyp els (>i,>unparse partyp els ,show partyp els >), ->;
unparse partyp els (>i,>empty,empty>):.

unparse typ list (>i, >LIST * unparse typ*unparse typ els , show typ+show typ els >):
        unparse typ(>i,>unparse typ,show typ>),
        unparse typ els (>i,>unparse typ els ,show typ els >), ->;
unparse typ list (>i,>LIST*empty,empty>):.

unparse typ els (>i,>unparse typ * unparse typ els ," &"+show typ+show typ els >):
        unparse typ(>i,>unparse typ,show typ>),
        unparse typ els (>i,>unparse typ els ,show typ els >), ->;
unparse typ els (>i,>empty,empty>):.

unparse formcon list (>i, >LIST * unparse formcon*unparse formcon els , show formcon+show formcon els >):
        unparse formcon(>i,>unparse formcon,show formcon>),
        unparse formcon els (>i,>unparse formcon els ,show formcon els >), ->;
unparse formcon list (>i,>LIST*empty,empty>):.

unparse formcon els (>i,>unparse formcon * unparse formcon els ,","+show formcon+show formcon els >):
        unparse formcon(>i,>unparse formcon,show formcon>),
        unparse formcon els (>i,>unparse formcon els ,show formcon els >), ->;
unparse formcon els (>i,>empty,empty>):.

unparse val list (>in app,>sep,>i, >LIST * unparse val*unparse val els , show val+show val els>):
        unparse val(>in app,>i,>unparse val,show val>),
        unparse val els (>in app, >sep,>i,>unparse val els ,show val els >), ->;
unparse val list (>in app,>sep,>i,>LIST*empty,empty>):.

unparse val els (>in app, >sep,>i,>unparse val * unparse val els ,sep+show val+show val els >):
        unparse val(>in app,>i,>unparse val,show val>),
        unparse val els (>in app, >sep,>i,>unparse val els ,show val els >), ->;
unparse val els (>in app, >sep,>i,>empty,empty>):.

unparse parval list (>i, >LIST * unparse parval*unparse parval els , show parval+show parval els >):
        unparse parval(>i,>unparse parval,show parval>),
        unparse parval els (>i,>unparse parval els ,show parval els >), ->;
unparse parval list (>i,>LIST*empty,empty>):.

unparse parval els (>i,>unparse parval * unparse parval els ," "+show parval+show parval els >):
        unparse parval(>i,>unparse parval,show parval>),
        unparse parval els (>i,>unparse parval els ,show parval els >), ->;
unparse parval els (>i,>empty,empty>):.


unparse i num (>i,>I NUM * i num," "+closed i+" ">): 
        close  num (>i num, closed i>),->; 
unparse i num (>i,>NaN * nan,"\n*** Not a Number: "+nan+"\n">) : .

unparse f num (>i,> F NUM *F," "+closed f+" ">): close num (>F, closed f>),->; 
unparse f num (>i,>NaN * nan,"\n*** Not a Number: "+nan+"\n">) : .

unparse string (>i,> STRING * string," "+ quote+string+quote+" ">) : .

unparse bool (>i,> BOOL * T or F , T or F+" ">) : .

unparse symbol (>i,>STRING*symbol, SYMBOL>):
     includes (>symbol,>empty),
     where (>symbol, SYMBOL>),->;
unparse symbol (>i,>STRING*symbol, symbol>):.

F ::@ must include decimal point.

must include decimal point (f+".0">):
 ^!.!* (f>), end of sentence, ->;
must include decimal point (f>):
  ^!! * (f>).

close num (>"-"+x, "(-"+x+")">): ->;
close num (>x, x>):.
#
NUMBER :: @ Number(x>).
SYMBOL :: @ Symbol(x>).

Number(x>): !0123456789!+ (x>).
Symbol (l+ll>): letters (l>), more letters (ll>). 
#
letters (l>) : ^!_! *(l>).

more letters (empty>): "_", Number (x>), end of sentence, ->;
more letters ("_"+s>): "_", Symbol (s>),  ->;
more letters (empty>): .

#
E :: " *** ".
ID :: "\n/*\n *\n * Output of Kernel datastructure Unparser \n *\n */\n".
#

