2015-09-11 40 views
1

我是OCaml的初学者,并试图构建一个解析器,我想要一个列表将所有方法存储在我的类中。这是我在.mly文件中的一部分。运算符:: OCaml

init_method_list: 
    { [] } 
    | method_list method_decl { List.rev($1) } 
; 

method_list: 
    method_decl { [ $1 ] } 
    | method_list method_decl { $2 :: $1 } 
; 

任何人都可以解释到底发生了什么?特别是::操作。一直在搜索,但无法在文档中找到运营商。

我得到这个列表可以是空的,或者我们做出正确的递归调用来填充它在类中的所有方法。 method_decl只是查找代表方法的特定标记组合的匹配。

+0

预先加上'$ 2'和'$ 1'? – cchantep

+0

在Ocaml中,运算符'::'用于将''a'类型的元素连接到''list'类型的列表。 – alifirat

+0

好的谢谢,它是否将元素预先列在列表的前面? @alifirat – novalain

回答

4

正如我在我的评论说,运营商::是用来'a类型的元素串联到'a list类型的列表。一个小例子:

1 :: [2;3]产生列表[1;2;3]所以是它将元素前置到列表的前面。

+1

的基本教程'::'不是一个真正的运算符,而是一个句法符号 - 这就是为什么它被允许出现在匹配模式运营商不是。 –

0

正如其他人所说,::将一个元素连接到相同类型的列表上。仅作为一个额外的处理,如果需要连接两个列表,则可以使用@符号,例如:

[1; 2; 3] @ [4]将给出列表[1; 2; 3; 4]