2010-11-25 1 views
2

Я создаю программу, которая использует грамматику и видит, является ли эта грамматика LL (1). Я хочу использовать модуль Set, но я понятия не имею, как действовать, конечно, тип элементов набора будет char, вы можете помочь?Использовать модуль Set Ocaml

ответ

3

Этот ответ предполагает, что вы уже знаете, как определить, является ли грамматика 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 выше имеет interface described in the documentation. Суть ее в том, что наборы неизменные ценности (как списки), поэтому модуль предоставляет вам функции, которые создают новый набор из существующего набора путем добавления или удаления элементов:

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 */ *) 
+0

Я не знаю. Возможно нет. Требует ли ваш алгоритм хранения грамматик в наборе? – 2010-11-26 08:00:52

 Смежные вопросы

  • Нет связанных вопросов^_^