Чтение строки (из файла) в Прологе - PullRequest
3 голосов
/ 04 декабря 2009

Я написал лексер и парсер в Прологе. Он объединяет строку со своим AST. Это часть проекта компилятора / интерпретатора, над которым я работаю. Естественно, теперь я хочу прочитать строку из файла, чтобы проанализировать ее. Тем не менее, предикаты, которые я нашел для этого, read , и он читает только атомы и предикаты Prolog, как файлы с

hello.

Я вертелся с настройками double_quotes , но безуспешно.

Я хочу иметь возможность читать файл с чем-то вроде этого

let id = \x.x in id (S (S Z))

, а затем отправьте эту строку в предикаты анализа.

1 Ответ

8 голосов
/ 04 декабря 2009

Вы можете использовать read_line_to_codes/2 или read_line_to_codes/3. Пример программы, которая читает отдельные строки из stdin и печатает их в stdout , выглядит следующим образом:

read_lines([H|T]) :-
  read_line_to_codes(user_input, H), H \= end_of_file, read_lines(T).
read_lines([]).

write_lines([]).
write_lines([H|T]) :-
  writef("%s\n", [H]), write_lines(T).

main :-
  read_lines(X), write_lines(X).

(Используется writef/2 для печати.) Есть также read_stream_to_codes/2 и read_stream_to_codes/3, которые не связаны со строками. Следующий код печатает все входные данные из стандартного ввода за один раз в стандартный вывод:

main :-
  read_stream_to_codes(user_input, X), writef("%s", [X]).

Конечно, также можно читать из файла вместо стандартного ввода. Для получения дополнительной информации см. Библиотеку readutil.

...