Сделайте таблицу, содержащую токены, видимой для обоих.mly и.mll

Я хотел бы определить keyword_table который сопоставляет некоторые строки с некоторыми токенами, и я хотел бы сделать эту таблицу видимой для обоих parser.mly а также lexer.mll,

Кажется, что таблица должна быть определена в parser.mly,

%{ 
  open Utility (* where hash_table is defined to make a table from a list *)
  let keyword_table = hash_table [
      "Call", CALL; "Case", CASE; "Close", CLOSE; "Const", CONST; 
      "Declare", DECLARE; "DefBool", DEFBOOL; "DefByte", DEFBYTE ]
%}

Тем не менее, я не мог использовать его в lexer.mll, например

{
open Parser
let x = keyword_table (* doesn't work *)
let x = Parser.keyword_table (* doesn't work *)
let x = Parsing.keyword_table (* doesn't work *)
}

Кто-нибудь может сказать мне, где проблема? Разве нельзя сделать данные видимыми для обоих parser.mly а также lexer.mll?

2 ответа

Решение

Как упоминалось в ответе GSG, ocamlyacc генерирует mli интерфейс вместе с ml реализация парсера, и экспортирует только тип токенов и точки входа. Согласно http://caml.inria.fr/mantis/view.php?id=1703, это вряд ли изменится, поэтому у вас есть два решения:

  • изменить сгенерированный mli потом (обычно у меня есть правило в моем Makefile это просто rm это, но вы можете просто добавить необходимые подписи вместо этого).
  • использование menhir как предложено в сообщении об ошибке, упомянутом выше.

Да, это довольно просто. Вы можете просто поместить данные в третий файл.ml и указать, что:

В.mly:

%{ 
    open Data
%}

В.mll:

{
    open Data
}

Вы не сможете ссылаться на внутренние определения parse.mly в других файлах. когда ocamlyacc работает, он будет генерировать parse.mli это не сделает их доступными.

Другие вопросы по тегам