Сделайте таблицу, содержащую токены, видимой для обоих.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
это не сделает их доступными.