2015-09-11 3 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

preend '$ 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]