:- 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))}.