Есть ли способ экспортировать больше вещей, когда я создаю парсер с менгиром?

Я использую menhir для создания парсера, и прямо сейчас файл parser.mli, который он сгенерировал из моего файла parser.mly, выглядит так:

(* The type of tokens. *)

type token = 
  (* ... huge ADT definition goes here ... *)

(* This exception is raised by the monolithic API functions. *)

exception Error

(* The monolithic API. *)

val start: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> Types.ast

Есть ли способ включить больше вещей в интерфейс моего парсера? В частности, я хотел бы также иметь возможность экспортировать тип данных для моего AST (который в настоящее время находится в отдельном модуле Types) и некоторые функции, которые работают с типом данных токена (например, функция для преобразования их обратно в строки).

Я попытался поместить некоторый код Ocaml после %% в parser.mly, но хотя этот код отображается в parser.ml, ни одна из объявленных мной функций не появляется в parser.mli.


person hugomg    schedule 21.07.2016    source источник
comment
Обычно вы размещаете тип AST и служебные функции в их собственном модуле, например. Syntax.   -  person pdexter    schedule 22.07.2016
comment
Если я это сделаю, у меня возникнет проблема с циклической зависимостью. модуль Parser зависит от типов ast, определенных в модуле Syntax, а модуль Syntax зависит от типа токена, определенного внутри Parser   -  person hugomg    schedule 22.07.2016
comment
Тип токена, вероятно, должен быть определен в лексере.   -  person pdexter    schedule 22.07.2016
comment
Я хотел бы иметь возможность определять токены в лексере, но я не знаю, как сказать менгиру использовать пользовательский тип токена (вместо того, который был сгенерирован объявлениями %token)   -  person hugomg    schedule 22.07.2016
comment
О, подождите, извините, я понял это задом наперед (не был перед компьютером). Почему ваш синтаксический модуль зависит от типа токена? Если вы удалите эту зависимость, все будет в порядке. Например, в одном проекте у меня есть функция string_of_token в лексере.   -  person pdexter    schedule 22.07.2016
comment
Помещение туда string_of_token решило бы круговую проблему, но странно, что я могу поместить дополнительные функции в модуль Lexer, но не в модуль Parser, не так ли?   -  person hugomg    schedule 22.07.2016
comment
Ага. Я не мастер менгира, поэтому, надеюсь, кто-то другой предложит лучшее решение.   -  person pdexter    schedule 22.07.2016
comment
Связанный вопрос: stackoverflow.com/q/40514349   -  person Arto Bendiken    schedule 12.04.2018