Из контекста ваших предыдущих вопросов, вам, похоже, на самом деле нужен способ разобрать текст, содержащий сочетание целых чисел и символов, описывающих переходы для конечного автомата. Я бы посоветовал вам лучше всего использовать модуль Scanf
. Если вам нужно что-то гораздо более сложное, для этого может потребоваться рукописный сканер (вы можете использовать Str.string_match
для этого или - если вы хотите глубоко погрузиться в генератор сканера ocamllex
).
Простой пример чтения строки из канала Scanf будет:
let read_transition input =
try
let line = input_line input in
Scanf.sscanf line "%d %c %d"
(fun x ch y -> Some (x, ch, y))
with End_of_file -> None
Обратите внимание, что мы читаем строку с input_line
, а не с помощью Scanf.scanf
на входной канал непосредственно. Причина в том, что Scanf.scanf
может потребоваться до знака, стоящего на вид, и, таким образом, если вы смешаете его с другими способами чтения канала, символы могут пропустить. Используя input_line
, а затем Scanf.sscanf
(вместо Scanf.scanf
), мы избегаем этого углового случая.
Обратите также внимание, что в зависимости от синтаксиса ввода вам может потребоваться соответствующим образом отрегулировать шаблон scanf.
Ну, строго говоря, строка не является массивом символов, последняя - '[| a; b; c |]'. И это доступ с синтаксисом 'x. (I)'. – ivg