natural
a vytvoříme další dva parsery pro číselné typy --
pro čísla celá a čísla s pohyblivou řádovou čárkou.
Parser celých čísel se liší od natural
tím, že mu může
předcházet znaménko mínus. Podle jeho výskytu mutátor volby vydá
hodnotu resp. jíž je vynásobeno:
int(W):- W :-> ( symbol("-")<?@?>1-const(-1) <&>> natural <@ alter(C>N,C*N) => eval ).Slíbeným druhým parserem je
double
. Nejdříve definujeme
parser pro zlomkovou část:fractionalPart(W):- W :-> ( digit<<+>> <@ foldR(evalFract,0.0) ). evalFract(I,Acc,Result):- Result is (I+Acc)/10.Číslo s pohyblivou řádovou čárkou se skládá z celočíselné části, desetinné tečky, desetinné části, znaku
e
nebo E
a celočíselného exponentu. Jak je vidět, desetinná nebo exponentová
část může být vynechána:double(W):- W :-> ((int <&>> (symbol(".") &> fractionalPart)<<?@>>0.0-id <&>> (symbols("eE") &> int)<<?@>>0.0-id) <@ evalDouble). evalDouble(I>(F>E),R):- I<0 -> R is (I+F*(-1))*10^E ; R is (I+F)*10^E.Použití právě zkonstruovaného parseru vyzkoušíme na příkladu:
?- double(s("-1.2e-3")+L). L = [s([])> -0.0012] Yes