2014-02-20 3 views
0

Я пытаюсь написать парсер OCamllex, который строит строчную карту слов из списка. Тем не менее, я получаю сообщение об ошибке «Неограниченные модуль» при попытке открыть модуль StringMap в заголовке:Использование StringMap в OCamllex

{ 
    open StringMap 
    type token = EOF | Word of string 
} 
(* other code *) 

Та же ошибка возникает, когда я явно не открывать модуль, и когда я пытаюсь создать карта в трейлере:

module StringMap = Map.Make (String) 

Все учебники OCaml предлагают использовать правильный синтаксис; так что, возможно, я злоупотребляю OCamllex (?) Я признаю, что область заголовка, правил и трейлера мне не понятна. Я искал решение в документации, но учебники, ориентированные на OCamllex, скудны. Может ли кто-нибудь сказать, что я делаю неправильно? Поддерживает ли OCamllex модуль StringMap?

ответ

1

Проблема в том, что модуль StringMap существует: вы должны сгенерировать его с помощью приложения-функтора, такого как module StringMap = Map.Make (String). Поместите это в заголовок , а не в трейлер. (Код прицепа будет помещен в конце созданного файла, и, таким образом, переплеты, установленные в нем не могут быть видны из вашего кода лексического анализатора.)

Если вы хотите, вы можете также открыть модуль:

open module StringMap = Map.Make (String) 

Открытые модули считаются несколько плохими. В частности, избегайте открытия модулей, таких как приложения Map и Set, так как их определения compare будут теневать обычным от Pervasives и порождать путаницу.

+0

Благодарим за отзыв. Мне непонятно, как заголовок, правила и трейлер охвачены. Являются ли привязки, которые я устанавливаю в заголовке, доступном в трейлере? Если бы я планировал использовать StringMap только в трейлере, достаточно ли было бы открыть там модуль? И если считать открытый стиль открытым модулем, как еще мне получить доступ к StringMaps - так как он не входит в стандартную библиотеку. – jdmartin86

+0

Да, привязки, которые вы устанавливаете в заголовке, доступны в трейлере (и в правилах). Если вы используете только что-то в трейлере, вам нужно только привязать его там, но вам нужно связать его перед использованием. Для использования имен внутри модуля, не открывая его, просто прикрепите имя к модулю: 'StringMap.find', а не просто' find'. (Вам все равно нужно * создать * этот модуль с 'модулем StringMap = ...' первым.) – gsg

+0

Ах, вы правы - мне нужно создать сам модуль. Не открывается модуль, который не является частью стандартной библиотеки. Спасибо за ваше терпение; это моя вторая неделя, используя язык! – jdmartin86