summaryrefslogtreecommitdiff
path: root/read.prolog
diff options
context:
space:
mode:
Diffstat (limited to 'read.prolog')
-rw-r--r--read.prolog56
1 files changed, 56 insertions, 0 deletions
diff --git a/read.prolog b/read.prolog
new file mode 100644
index 0000000..63d3ae7
--- /dev/null
+++ b/read.prolog
@@ -0,0 +1,56 @@
+
+:- module(read, [prompt/1, readList/1]).
+
+
+% functions for obtaining a line of input text and parsing
+% it into a list of words
+
+% prompt provides the user with a '>' prompt as well
+% readList merely obtains and parses the input
+
+
+prompt(L) :-
+ write('> '),
+ readList(L).
+
+
+readList(L) :-
+ readLine(X),
+ wordList(L,X,[]), !.
+
+
+readLine(L) :-
+ get_char(C),
+ readLine_tail(C,L).
+
+
+readLine_tail('\n',[]) :- !.
+readLine_tail(C,[C|X]) :-
+ get_char(C2),
+ readLine_tail(C2,X).
+
+
+wordList(X) --> whitespace, wordList(X).
+wordList([X]) --> word(X).
+wordList([X]) --> word(X), whitespace.
+wordList([X|Y]) --> word(X), whitespace, wordList(Y).
+
+
+word(W) --> charList(X), {atom_chars(W,X)}.
+
+
+charList([X|Xs]) --> char(X), charList(Xs).
+charList([X]) --> char(X).
+
+
+whitespace --> whsp, whitespace.
+whitespace --> whsp.
+
+
+whsp --> oneOf(_,[' ', '\r', '\n', '\t']).
+char(X) --> noneOf(X,[' ', '\r', '\n', '\t']).
+
+
+oneOf(X,L) --> [X], {member(X,L)}.
+noneOf(X,L) --> [X], {not(member(X,L))}.
+