我正在创建一个使用语法的程序,看看这个语法是否是LL(1)。我想使用模块Set,但我不知道如何继续,当然,set的元素类型将为char,你能帮忙吗?
答案 0 :(得分:3)
这个答案假定您已经知道如何确定语法是否为LL(1),并且只是在寻找有关Objective Caml Set
模块的特定用法的帮助。
标准库Set
提供了一个仿函数,可让您构建自己的set模块,以满足您的特定需求。您需要提供一个模块来描述集合中的元素类型,以及一个遵循与compare
相同约定的比较函数:compare a b = 0
if a = b
,compare a b < 0
if 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 */ *)