From e67ef3951c43b143093aec3bcbde975a686b36b2 Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Mon, 12 Aug 2019 20:59:02 -0700 Subject: [PATCH] Minor cleanup of the parser. --- thun/gnu-prolog/parser.pl | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/thun/gnu-prolog/parser.pl b/thun/gnu-prolog/parser.pl index c953d03..4536cce 100644 --- a/thun/gnu-prolog/parser.pl +++ b/thun/gnu-prolog/parser.pl @@ -39,19 +39,14 @@ num(N) --> digits(Codes), !, { number_codes(N, Codes) }. % Groups of characters. -chars([Ch|Rest]) --> char(Ch), chars(Rest). -chars([Ch]) --> char(Ch). - -blanks --> blank, !, blanks. -blanks --> []. - -digits([Ch|Rest]) --> digit(Ch), digits(Rest). -digits([Ch]) --> digit(Ch). +chars(Chars) --> one_or_more(char, Chars). +blanks --> blank, !, blanks | []. +digits(Digits) --> one_or_more(digit, Digits). % Character types. -char(Ch) --> [Ch], { nonvar(Ch), Ch \== 0'[, Ch \== 0'], between(33, 126, Ch) }. -blank --> [Ch], { nonvar(Ch), Ch =:= 32 ; between(9, 13, Ch) }. +char(Ch) --> [Ch], { nonvar(Ch), Ch =\= 0'[, Ch =\= 0'], between(33, 126, Ch) }. +blank --> [Ch], { nonvar(Ch),(Ch =:= 32 ; between(9, 13, Ch)) }. digit(Ch) --> [Ch], { nonvar(Ch), between(48, 57, Ch) }. @@ -64,6 +59,10 @@ line(10, []) :- !. % break on new-lines. line(-1, [eof]) :- !. % break on EOF line(X, [X|Line]) :- get_code(Y), !, line(Y, Line). +one_or_more(E, List) --> one_or_more_(List, E). + +one_or_more_([Ch|Rest], P) --> call(P, Ch), one_or_more_(Rest, P). +one_or_more_([Ch], P) --> call(P, Ch). /*