读取和标记文件
Reading and tokenizing a file
我正在尝试读入文件并使用空格作为分隔符拆分字符。我已经设法将输入分成原子列表,但我无法尝试将其拼凑起来。到目前为止,这是我的代码:
tokenize_file(Name, Ret) :-
open(Name, read, Str),
read_file(Str, Ret),
close(Str).
read_file(Stream,[]) :-
at_end_of_stream(Stream).
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
get0(Stream, Char),
write([X, Code]), nl,
read_file(Stream,L).
这会生成如下所示的输出:
X = [i, n, t, ' ', a, d, d, ' ', '('|...]
我似乎无法弄清楚的是如何遍历此列表并将空格之间的每组字符连接到另一个列表中。
我环顾四周,但我很难理解如何在 prolog 中操作列表。
找到解决方案:
tokenize_file(Name, Ret) :-
open(Name, read, Str),
read_file(Str, Lst),
atomic_list_concat(Lst, '', AtmConcat),
split_string(AtmConcat, " ", "", Ret),
close(Str).
原子列表连接重新创建输入字符串(可能比逐字符读取更有效,但它有效)。拆分字符串然后按空白字符拆分字符串。请注意,换行符实际上标记不同,因此其余代码也进行了修改:
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
get0(Stream, Code),
set_value(X, Code),
read_file(Stream,L).
set_value(X, 10) :-
char_code(X, 32).
set_value(X, Code) :-
char_code(X, Code).
这会将所有换行符替换为空格(ascii 字符 10 表示换行符)
我正在尝试读入文件并使用空格作为分隔符拆分字符。我已经设法将输入分成原子列表,但我无法尝试将其拼凑起来。到目前为止,这是我的代码:
tokenize_file(Name, Ret) :-
open(Name, read, Str),
read_file(Str, Ret),
close(Str).
read_file(Stream,[]) :-
at_end_of_stream(Stream).
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
get0(Stream, Char),
write([X, Code]), nl,
read_file(Stream,L).
这会生成如下所示的输出:
X = [i, n, t, ' ', a, d, d, ' ', '('|...]
我似乎无法弄清楚的是如何遍历此列表并将空格之间的每组字符连接到另一个列表中。 我环顾四周,但我很难理解如何在 prolog 中操作列表。
找到解决方案:
tokenize_file(Name, Ret) :-
open(Name, read, Str),
read_file(Str, Lst),
atomic_list_concat(Lst, '', AtmConcat),
split_string(AtmConcat, " ", "", Ret),
close(Str).
原子列表连接重新创建输入字符串(可能比逐字符读取更有效,但它有效)。拆分字符串然后按空白字符拆分字符串。请注意,换行符实际上标记不同,因此其余代码也进行了修改:
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
get0(Stream, Code),
set_value(X, Code),
read_file(Stream,L).
set_value(X, 10) :-
char_code(X, 32).
set_value(X, Code) :-
char_code(X, Code).
这会将所有换行符替换为空格(ascii 字符 10 表示换行符)