use newly available seq//1 from library(dcgs)
I am using seq(Ls) instead of plain Ls so that DCGs can be debugged declaratively, by generalizing away nonterminals in rules.
This commit is contained in:
@@ -128,14 +128,11 @@ format_elements([E|Es]) -->
|
|||||||
format_element(E),
|
format_element(E),
|
||||||
format_elements(Es).
|
format_elements(Es).
|
||||||
|
|
||||||
format_element(chars(Cs)) --> list(Cs).
|
format_element(chars(Cs)) --> seq(Cs).
|
||||||
format_element(glue(Fill,Num)) -->
|
format_element(glue(Fill,Num)) -->
|
||||||
{ length(Ls, Num),
|
{ length(Ls, Num),
|
||||||
maplist(=(Fill), Ls) },
|
maplist(=(Fill), Ls) },
|
||||||
list(Ls).
|
seq(Ls).
|
||||||
|
|
||||||
list([]) --> [].
|
|
||||||
list([L|Ls]) --> [L], list(Ls).
|
|
||||||
|
|
||||||
elements_gluevars([], N, N) --> [].
|
elements_gluevars([], N, N) --> [].
|
||||||
elements_gluevars([E|Es], N0, N) -->
|
elements_gluevars([E|Es], N0, N) -->
|
||||||
@@ -192,11 +189,11 @@ cells([~|Fs0], Args0, Tab, Es, VNs) -->
|
|||||||
Delta is Num - L,
|
Delta is Num - L,
|
||||||
length(Zs, Delta),
|
length(Zs, Delta),
|
||||||
maplist(=('0'), Zs),
|
maplist(=('0'), Zs),
|
||||||
phrase(("0.",list(Zs),list(Cs0)), Cs)
|
phrase(("0.",seq(Zs),seq(Cs0)), Cs)
|
||||||
; BeforeComma is L - Num,
|
; BeforeComma is L - Num,
|
||||||
length(Bs, BeforeComma),
|
length(Bs, BeforeComma),
|
||||||
append(Bs, Ds, Cs0),
|
append(Bs, Ds, Cs0),
|
||||||
phrase((list(Bs),".",list(Ds)), Cs)
|
phrase((seq(Bs),".",seq(Ds)), Cs)
|
||||||
) }
|
) }
|
||||||
),
|
),
|
||||||
cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
|
cells(Fs, Args, Tab, [chars(Cs)|Es], VNs).
|
||||||
@@ -204,7 +201,7 @@ cells([~|Fs0], Args0, Tab, Es, VNs) -->
|
|||||||
{ numeric_argument(Fs0, Num, ['D'|Fs], Args0, [Arg|Args]) },
|
{ numeric_argument(Fs0, Num, ['D'|Fs], Args0, [Arg|Args]) },
|
||||||
!,
|
!,
|
||||||
{ number_chars(Num, NCs),
|
{ number_chars(Num, NCs),
|
||||||
phrase(("~",list(NCs),"d"), FStr),
|
phrase(("~",seq(NCs),"d"), FStr),
|
||||||
phrase(format_(FStr, [Arg]), Cs0),
|
phrase(format_(FStr, [Arg]), Cs0),
|
||||||
phrase(upto_what(Bs0, .), Cs0, Ds),
|
phrase(upto_what(Bs0, .), Cs0, Ds),
|
||||||
reverse(Bs0, Bs1),
|
reverse(Bs0, Bs1),
|
||||||
@@ -320,7 +317,7 @@ upto_what([C|Cs], W) --> [C], !, upto_what(Cs, W).
|
|||||||
upto_what([], _) --> [].
|
upto_what([], _) --> [].
|
||||||
|
|
||||||
groups_of_three([A,B,C,D|Rs]) --> !, [A,B,C], ",", groups_of_three([D|Rs]).
|
groups_of_three([A,B,C,D|Rs]) --> !, [A,B,C], ",", groups_of_three([D|Rs]).
|
||||||
groups_of_three(Ls) --> list(Ls).
|
groups_of_three(Ls) --> seq(Ls).
|
||||||
|
|
||||||
cell(From, To, Es0) -->
|
cell(From, To, Es0) -->
|
||||||
( { Es0 == [] } -> []
|
( { Es0 == [] } -> []
|
||||||
@@ -488,7 +485,7 @@ var_name(V, Name=V, Num0, Num) :-
|
|||||||
|
|
||||||
literal(Lit, VNs) -->
|
literal(Lit, VNs) -->
|
||||||
{ write_term_to_chars(Lit, [quoted(true),variable_names(VNs)], Ls) },
|
{ write_term_to_chars(Lit, [quoted(true),variable_names(VNs)], Ls) },
|
||||||
list(Ls).
|
seq(Ls).
|
||||||
|
|
||||||
portray_(Var, VNs) --> { var(Var) }, !, literal(Var, VNs).
|
portray_(Var, VNs) --> { var(Var) }, !, literal(Var, VNs).
|
||||||
portray_((Head :- Body), VNs) --> !,
|
portray_((Head :- Body), VNs) --> !,
|
||||||
|
|||||||
Reference in New Issue
Block a user