Чтение строки (из файла) в Прологе

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

hello.

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

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

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

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


person danr    schedule 04.12.2009    source источник


Ответы (1)


Вы можете использовать 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.

person Stephan202    schedule 04.12.2009
comment
Спасибо :) Это было именно то, что я искал! - person danr; 04.12.2009