В этом ответе предполагается, что вы уже знаете, как определить, соответствует ли грамматика LL (1), и просто ищете справку по конкретному использованию модуля Objective Caml Set
.
Стандартная библиотека Set
предоставляет функтор, который позволяет вам создавать свой собственный набор модулей, адаптированный к вашим конкретным потребностям.Вам необходимо предоставить модуль, который описывает тип элементов внутри набора, и функцию сравнения, которая следует тому же соглашению, что и compare
: compare a b = 0
, если a = b
, compare a b < 0
, если a < b
и так далее.Для символов это может быть:
module OrderedChar = struct
type t = char
let compare = compare
end
module CharSet = Set.Make(OrderedChar)
Модуль CharSet
выше имеет интерфейс , описанный в документации .Суть в том, что наборы являются неизменяемыми значениями (например, списками), поэтому модуль предоставляет вам функции, которые создают новый набор из существующего набора путем добавления или удаления элементов:
let a = CharSet.add 'a' CharSet.empty
let ab = CharSet.add 'b' a
let b = CharSet.remove 'a' ab
(* /* a, b and ab are three sets containing respectively {a}, {b} and {ab} */ *)
Доступ к элементамнабор происходит в основном через запросы существования и итерацией:
assert (CharSet.mem 'a' ab)
assert (not (CharSet.mem 'c' b))
CharSet.iter print_char ab
(* /* Prints 'ab' : follows the order defined by your 'compare' function */ *)