Пролог получает строку ввода от пользователей и избегает завершения программы в случае неправильного ввода - PullRequest
0 голосов
/ 07 января 2012

Я пытаюсь написать простую оболочку в прологе.В настоящее время я запрашиваю у пользователя ввод данных с помощью read / 1.

Однако у меня есть две проблемы, которые я хотел бы решить.

1) пользователь может вводить только термины.

theЗапрос требует, чтобы пользователь ввел термин, и требует, чтобы ввод заканчивался точкой.Это ограничение, поскольку я хочу, чтобы пользователь мог вводить команды, такие как «установить переменную в значение» (я проанализирую эту строку).Есть ли способ прочитать такие строки в прологе?(если возможно без каких-либо издержек, таких как представление списка, кавычки или конечный период?)

2) если пользователь вводит что-то неправильное (например, пробел), я получаю синтаксическую ошибку и оболочка завершается.Какой быстрый и правильный способ справиться с этими ошибками и избежать завершения программы?

Вся помощь наиболее ценится!

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Лучший из доступных «инструментов»: DCG. Например, используя SWI-Prolog:

:- [library(http/dcg_basics),
    library(dialect/sicstus)
   ].


myshell :-
  read_line(L),
  phrase(command(C), L).

command(set(Variable, Value)) -->
  "set ", string(Variable), " to ", string(Value).
2 голосов
/ 07 января 2012

Чтение ввода не ограничено терминами, но может быть выполнено для каждого символа или для байта с помощью get_char/1 и get_byte/1. Не совсем убедительно, даже не так легко работать. Например, вы можете взглянуть на небольшой фрагмент из Art of Prolog , где авторы определяют предикат для чтения списка слов из стандартного ввода (определения для некоторых конкретных процедуры отсутствуют, т. е. предоставляются читателем на основании его потребностей).

Prolog поддерживает обработку ошибок с помощью catch/3, которую вы можете использовать для обнаружения ошибок, возникших во время операций чтения, и правильного реагирования.

...